On Fri, Aug 29, 2003 at 11:50:00PM +0200, Tom Guder wrote:
Hallo!
Ich habe eine kleine Unklarheit in C entdeckt (wahrscheinlich seh' ich den Wald vor lauter Bäumen nicht)
Beispiel
void main(void) { float a = 0.41, b=1.22; rechne(a, b); return 0; }
void rechne(float z, float y) { printf("%f, %f", z, y); return 0; }
z und y stimmen nun aber nicht mit a und b überein!?
Zuerstmal solltest Du ja 'ne Menge Warnungen sehen:
cc x.c -o x x.c: In function `main': x.c:5: warning: `return' with a value, in function returning void x.c:2: warning: return type of `main' is not `int' x.c: At top level: x.c:9: warning: type mismatch with previous implicit declaration x.c:4: warning: previous implicit declaration of `rechne' x.c:9: warning: `rechne' was previously implicitly declared to return `int' x.c: In function `rechne': x.c:11: warning: `return' with a value, in function returning void
Wie kommt das? Einige erklären sich ziemlich einfach:
x.c: In function `main': x.c:5: warning: `return' with a value, in function returning void x.c:2: warning: return type of `main' is not `int'
main() liefert immer etwas zurück. Sollte also 'int' definiert werden. Dann hast Du (trotz 'void') doch einen return-Wert. => int main() ... wäre ok
x.c: At top level: x.c:9: warning: type mismatch with previous implicit declaration x.c:4: warning: previous implicit declaration of `rechne'
Hier liegt der Hase im Pfeffer. Beim Aufruf der Funktion ist dem Compiler noch nichts über diese Funktion bekannt. Sie erscheint ja in Deinem Quelltext erst später. Also muß er Vermutungen anstellen, er macht sich eine 'implizite' Deklaration, die da so aussieht:
int rechne();
Wobei er davon ausgeht, daß eventuelle Parameter vom Typ int sind [oops, jetzt doch 'ne Frage an die Experten, warum tut er das? Er sieht doch, daß es float ist, was hier als a und b übergeben wird?]
Am Ende paßt das nicht gut zu Deiner Defininition.
Der einfachste Ausweg ist, die Funktion rechtzeitig zu *deklarieren*, also *vor* der ersten Verwendung (üblicherweise macht man das vor main) folgendes einzufügen:
int rechne(float, float);
Dann weiß er Bescheid, wenn er später auf die Funktion stoßen sollte.
x.c:9: warning: `rechne' was previously implicitly declared to return `int' x.c: In function `rechne': x.c:11: warning: `return' with a value, in function returning void
Das kommt dann noch dazu, stört in diesem Zusammenhang aber nicht wirklich. Du definierst die Funktion als 'void', hast aber dann doch einen Return-Wert zurückgegeben.
Best regards from Dresden Viele Gruesse aus Dresden Heiko Schlittermann