Nicht angemeldet. · Kennwort vergessen · Registrieren

ve15mypo
Mitglied seit 12/2014
5 Beiträge
Betreff: 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
Mitglied seit 05/2011
41 Beiträge
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.
Dieser Beitrag wurde am 15.07.2015, 20:08 von killermiller verändert.
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Zitat von 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
Mitglied seit 05/2011
41 Beiträge
Zitat von Raim:
Zitat von 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
Mitglied seit 12/2014
5 Beiträge
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)
Dieser Beitrag wurde am 16.07.2015, 09:41 von ve15mypo verändert.
killermiller
Mitglied seit 05/2011
41 Beiträge
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
Mitglied seit 07/2013
5 Beiträge
Antwort auf Beitrag #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
Mitglied seit 12/2014
5 Beiträge
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
Mitglied seit 05/2011
41 Beiträge
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.
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen