005
10.11.2017, 17:47 Uhr
ao
(Operator)
|
Zitat von breezy: |
Okay, also würde der Aufruf mit z.B. f22(); mit void arbeiten und somit ein Fehler anzeigen?
|
"Mit void arbeiten" ist ein bisschen merkwürdig ausgedrückt, aber ich denke, du meinst das richtige.
f22 ist ganz oben (unter den ganzen #includes) deklariert als "int f22 (int iB);" Das ist der sogenannte Prototyp, der dem Compiler anzeigt, wie die Funktion f22 zu gebrauchen ist (einen int übergeben, ein int in der Rückgabe).
Anmerkung: Das iB könnte an dieser Stelle auch fehlen, zum Deklarieren braucht man nur die Datentypen der Parameter. "int f22 (int);" ist also bereits ein gültiger Prototyp, mit dem ein Compiler was anfangen kann. Häufig wird der Prototyp aber gleichzeitig zum Dokumentieren für andere Programmierer verwendet, und die wollen natürlich nicht nur Anzahl und Typen der Parameter kennen, sondern auch die Bedeutung, damit sie wissen, wie sie sie benutzen müssen. Hierfür ist der Bezeichnername hilfreich.
Jedenfalls, nachdem f22 so deklariert wurde, kann es nur so benutzt werden (mit Übergabe eines int). Alles andere ist ein Fehler.
Wenn f22 so deklariert wäre: int f22 (int x, int y); dann müsstest du beim Aufrufen immer zwei Argumente übergeben: f22 (123, 456);
Zitat: |
Wenn ich nun f12(100), f22(101) und f32(102) aufrufe wäre es richtig? (Offensichtlich, der compiler findets gut)
|
Ja.
Zitat: |
Warum kann ich dann aber f12 nicht mit f12(iA) aufrufen? Er beschwert sich über eine nicht deklarierte Variable. Muss ich die Variable zwingend definieren für den Aufruf mit iA?
|
Wenn du eine Variable mit dem Namen iA an der Stelle verwenden willst, dann muss sie vorher deklariert sein. Ein C- oder C++-Compiler kann Variablen nicht einfach so aus dem Nichts erzeugen. Du müsstest dann schreiben
C++: |
int main () { int iA = 42; f12 (iA); }
|
Zitat: |
Und eine letzte Frage, muss z.B. die Funktion f11 einen Wert zurück geben oder kann ich return (); weg lassen?
|
Das Weglassen ist kein Fehler, der vom Compiler bestraft wird, aber du solltest es auf keinen Fall tun. Das ist ein Fall von sogenanntem "undefined behaviour". Das heißt, es kann heute glatt funktionieren und morgen aus heiterem Himmel abstürzen. Das gilt für Funktionen, die einen echten Rückgabetyp (also nicht void) haben.
Das ist eine der wirklich bösen Stellen in C, weil man leicht mal ein return vergessen kann, wenn Funktion ein paar If-Verzweigungen hat, und ich persönlich verstehe auch nicht, warum das nicht verboten ist (oder ist es das inzwischen?). Tatsache ist, dass alle modernen Compiler das erkennen und eine Warnung ausgeben können. Tatsache ist auch, dass ich schon mal stundenlang nach einem mysteriösen Absturz gesucht habe, der an sowas lag, und dass ich seitdem in jedem Projekt, das ich anfange, diese Warnung auf "Fehler" setze. Das heißt, ich will in dem Fall eine Fehlermeldung haben, der Compiler soll das nicht akzeptieren, weil die Folgen echt übel sein können.
Mit welchem Compiler arbeitest du? |