Not logged in. · Lost password · Register

ve15mypo
Member since Dec 2014
5 posts
Subject: Multiple-Choice-Fragen
Hallo, ich habe 4 Fragen bezüglisch spezieller Multiple-Choice-Fragen, bei denen ich zwischen zwei Antworten jeweils schwanke, ich habe bereits einen Tutor gefragt, der war sich aber bei folgenden vier Aufgaben auch nicht ganz sicher und meinte ich solle hier fragen.

-Gegeben sei folgende Deklaration in einem C-Programm:
  typedef void (*func) (int,int);

 Welche Aussage ist richtig?

1. func ist ein Funktionszeiger auf eine void-Funktion, die zwei int-Parameter erwartet.
2. func ist Datentyp für Funktionszeiger auf void-Funktionen, die zwei int-Parameter erwarten.
3. func ist eine Funktion, die hier durch forward-Deklaration dem Compiler bekannt gegeben wird.
4. Der Compiler meldet einen Fehler, weil bei der Deklaration von func die Namen der formalen Parameter fehlen.

Antwort 3 und 4 kann ich hier schonmal in meinen Augen ausschließen, doch bei den anderen zwei bin ich etwas verloren.



-Welche der folgenden Aussagen zum Binden eines Programms ist richtig?

1. Auf einer Mikrocontroller-Plattform wird normalerweise dynamisch gebunden, weil dies Speicherplatz spart.
2. Der Binder löst #include-Anweisungen in einem C-Programm auf, indem er sie durch den Inhalt der einzubindenden Datei ersetzt.
3. Der Binder fügt Objektdateien und Bibliotheken zu einer ausführbaren Datei zusammen.
4. Beim Binden werden Zugriffe aus einem C-Modul auf globale static-Variablen eines anderen C-Moduls optimiert.

Die Lösung wird vermutlich Antwort 2 oder 3 sein, welche genau bin ich mir ebenfalls nicht sicher.



-Gegeben sei folgende Funktionsdeklaration:
  int f();

Welche Aussage ist richtig:

1. f ist eine parameterlose Funktion vom Typ int.
2. f ist eine rekursive Funktion.
3. Der Aufruf f("Hallo Welt"); wird vom Compiler als Fehler moniert.
4. Der Rückgabewert von f kann ignoriert werden.

2 und 4 lassen sich hier schonmal ausschließen, für 1 müsste die Deklaration doch int f(void) lauten?! Oder ist es 3 und der Compiler meldet sich?



-Welche Aussage zu folgender Funktion ist richtig?

  int *foo(){
   static int bar = 0;
   bar++;
   return &bar;
}

1. Die Funktion liefert einen Zeiger auf die lokale Variable bar zurück. Dies ist in C nicht zulässig und führt zu einem Übersetzungsfehler.
2. Die Variable bar ist über die Laufzeit der foo()-Funktion hinaus gültig. Daher kann der zurückgelieferte Zeiger sicher vom Aufrufer verwendet werden.
3. Die Variable bar enthält beim Verlassen der foo()-Funktion immer den Wert 1, da bar bei jedem Aufruf von foo() mit 0 initialisiert wird.
4. Beim Verlassen der Funktion foo() wird die automatische Variable bar vom Stack entfernt und der Zeiger verliert seine Gültigkeit. Ein Zugriff durch den Aufrufer führt zu zufälligen Ergebnissen.

Hier würde ich ebenfalls 1 und 4 aussschließen, mir ist bewusst das lokale static Variablen auch nach dem Verlassen der Funktion in der sie initialisiert wurden sich noch im Speicher befinden weshalb ich 2 plausibel finde, doch macht Antwort 3 in meinen Augen auch Sinn, da bei wiederholtem Aufrufen bar doch immer wieder auf den Wert 0 gesetzt wird, oder verstehe ich das falsch?



Vielen Dank schonmal im Vorraus für Hilfe sämtlicher Art :)

MfG Stefan
killermiller
Member since May 2011
41 posts
Zur ersten Frage:
2 ist richtig; das einzige, was "Datentyp" enthält und damit an dieser Stelle zu dem "typedef" passt.


Zur zweiten Frage:
Antwort 3 ist richtig.
Die ganzen #-Sachen macht der Präprozessor, nicht der Linker/Binder

Zur dritten Frage:
Spontan würde ich sagen, mit der richtigen Argumentation kannst du Antworten 1-4 als richtig durchbringen ;)
Die erste Antwort hängt von der Definition von "parameterlos" ab, du kannst der Funktion durchaus keine Parameter übergeben, du kannst aber auch alles beliebige übergeben. Man könnte aber auch sagen, die Funktion ist mit "offenen Parametern" deklariert, dann wäre die Antwort falsch.
Die dritte Antwort kann je nach Compiler-Version richtig oder falsch sein. Irgend ein alter C-Compiler frisst das wahrscheinlich ohne Beschwerden, ein aktueller C++-Compiler bringt mindestens eine Warnung (mit -werror dann auch einen Fehler, wenn nur "Error" als Fehler gezählt wird).
Die vierte Antwort kann je nach Funktion richtig sein, aber rein syntaktisch is se auf jeden Fall richtig, du kannst die Funktion defintiv verwenden, ohne den Rückgabewert weiter zu beachten. Man könnte auch argumentieren, dass der Rückgabewert evtl wichtige Informationen enthält und geprüft werden sollte.
Zur zweiten Antwort kann ohne Kenntnis des inneren Aufbaus der Funktion keine Aussage getroffen werden. Aber wenn ich davon ausgehe, dass die anderen drei falsch sind, muss nach Ausschlussprinzip und Klausuvorgabe (genau eine ist richtig) die zweite Stimmen.
(Ich hoffe, das war jetzt nicht zu falsch)

Zur vierten Frage:
Antwort 2 ist richtig, weil die lokale static-Variable im Speicher wie eine globale Variable behandelt wird, also verfügbar bleibt.
Antwort 3 ist deshalb falsch, weil die Initialisierung nur einmal aufgerufen wird, beim ersten Aufruf der entsprechenden Zeile. Danach wird der vorherige Wert verwendet.


Schreib bei sowas immer dazu, aus welcher Klausur das ist, dann können andere Leute das leichter nachvollziehen bzw. man kann auch mal mit der Musterlösung vergleichen, was laut Vorgabe stimmt.
This post was edited on 2015-07-15, 21:08 by killermiller.
Raim
GSPiC-Guru
Member since May 2011
79 posts
Quote by killermiller:
Zur dritten Frage:
[...] muss nach Ausschlussprinzip und Klausuvorgabe (genau eine ist richtig) die zweite Stimmen.

Eine rekursive Funktion wäre eine, die sich selbst aufruft. Also beispielsweise so eine:

  1. int fak(int n) {
  2.     if (n == 0) return 1;
  3.     return n * fak(n - 1);
  4. }

Es lässt sich aber nicht an der Deklaration ablesen, ob das der Fall ist.
killermiller
Member since May 2011
41 posts
Quote by Raim:
Quote by killermiller:
Zur dritten Frage:
[...] muss nach Ausschlussprinzip und Klausuvorgabe (genau eine ist richtig) die zweite Stimmen.

Eine rekursive Funktion wäre eine, die sich selbst aufruft. Also beispielsweise so eine:

  1. int fak(int n) {
  2.     if (n == 0) return 1;
  3.     return n * fak(n - 1);
  4. }

Es lässt sich aber nicht an der Deklaration ablesen, ob das der Fall ist.

Das war das, was ich mit "lässt sich ohne den inneren Aufbau der Funktion nicht sagen" meinte :)
Wie du richtig sagst, kann man allein aus der Deklaration nichts darüber aussagen.
Man kann's also auch nicht ausschließen. Und wenn die anderen drei falsch sind, bleibt nur noch das.
Zugegeben, das ist unrealistisch.
Aber was stimmt denn jetzt?
Hab die Frage leider in den Altklausuren nicht gefunden, und damit auch die Musterlösung nicht =/
ve15mypo
Member since Dec 2014
5 posts
Super vielen Dank für die Hilfe die Erklärungen leuchten ein :)

Zu Aufgabe 2:
Ist func hier nicht eigentlich der bezeichner und nicht ein Datentyp?

Zu Aufgabe 4:
Also wird der Schritt
Static int bar =0;
Nur beim ersten mal ausführen vollzogen und in allen darauffolgenden aufrufen ignoriert?

Die dritte Aufgabe ist von Juli 2013 Augabe 1g)
This post was edited on 2015-07-16, 10:41 by ve15mypo.
killermiller
Member since May 2011
41 posts
Zu Aufgabe 3:
Parameterlos ist eine Funktion scheinbar nur dann, wenn sie mit f(void) deklariert wurde. Man kann diese hier zwar auch ohne Parameter aufrufen, aber eben auch mit allem anderen, damit fällt die erste Antwort weg.
Die zweite Antwort kanns nur sein, wenn alle anderen defintiv falsch sind.
Der Compiler in der relevanten, verwendeten Version, nämlich der für C, scheint das dann ohne Fehler zu akzeptieren, damit ist auch die dritte Antwort falsch.
Aus Syntaktischer Sicht kann der Rückgabewert -wie bei jeder anderen Funktion- ignoriert werden, damit ist die vierte Antwort "am richtigsten" und wäre hier die gesuchte.

Zu Aufgabe 4:
genau.
dalo
GSPiC-Großmeister
Member since Jul 2013
5 posts
In reply to post #4
-Gegeben sei folgende Funktionsdeklaration:
  int f();

Welche Aussage ist richtig:

1. f ist eine parameterlose Funktion vom Typ int.
2. f ist eine rekursive Funktion.
3. Der Aufruf f("Hallo Welt"); wird vom Compiler als Fehler moniert.
4. Der Rückgabewert von f kann ignoriert werden.

2 und 4 lassen sich hier schonmal ausschließen, für 1 müsste die Deklaration doch int f(void) lauten?! Oder ist es 3 und der Compiler meldet sich?



Es gibt bei Multiple-Choice-Fragen immer genau eine "sicher richtige" Antwort. Daneben gibt es natürlich "falsche" Antworten, aber – und das ist das der Punkt hier – eben auch "unentscheidbare" Antworten. Es liegt in der Natur der Sache von MC-Fragen, dass man wenig über den Kontext weiß. Insofern wäre ich grundsätzlich vorsichtig mit "kontextbezogen herargumentieren". Das geht oft schief.
 

Die Frage ist also  immer, was wissen wir sicher?
 
Wenn da also nur eine Deklaration steht, dann dürfen wir eben keine Annahmen über den inneren Aufbau machen.  Ergo ist zum Beispiel 2. "unentscheidbar" und damit nicht "sicher richtig".

Zur Antwort: Siehe Skript 9-4ff :-)
ve15mypo
Member since Dec 2014
5 posts
Nochmal zu Aufgabe 2:
Ist func hier nicht eigentlich der bezeichner und nicht ein Datentyp? 

Zu Aufgabe 3:
Also meiner Meinung müsste es dann insgesammt so rauslaufen:

1. Ist falsch da void in der Deklaration stehen müsste.
2. Ist falsch, da wir von außen keine Aussage zum Aufbau der Funktion treffen können
3. Ist falsch da die deklaration "int f();" praktisch alles an Parameter annehmen kann, ohne einen Fehler auszugeben, ob dies sinnvoll ist ist eine andere Frage
4. Mit Hilfe des Skriptes würde ich sagen das ist richtig, den Rückgabewert kann man ignorieren ob dies wiederum sinnvoll ist ,ist eine andere Frage
killermiller
Member since May 2011
41 posts
Zu zwei:
Das muss jemand anderes beantworten...

Zu drei:
genau.
Bzw...zweite Antwort kann richtig sein, aber "kann richtig sein" reicht nicht; es muss sicher richtig sein, v.a. wenn eine sicher richtige Antwort dabei ist.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Special characters:
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen