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!?
Gruß, Tom
On Fri, Aug 29, 2003 at 11:50:00PM +0200, Tom Guder wrote:
Hallo!
Hi Tom,
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!?
Wieso? Nur weil an der Ausgabe ein paar Nullen mehr drann sind? Das kanst du auch über die printf() Parameter ändern. Zudem sind float Zahlen auf einem Computer _nie_ wirklich identisch, also bei a = 0.4, c = 0.2 muss ein a == 2 * c nicht stimmen.
Ciao, Tobias
Am Freitag, 29. August 2003 23:50 schrieb Tom Guder:
z und y stimmen nun aber nicht mit a und b überein!?
Doch, tun sie. Nur daß die printf-Formatierung noch ein paar Nullen anhängt.
Es sollte aber ein Prototyp für rechne() definiert werden (oder die Funktion nach oben geschoben werden). Außerdem kann rechne() nicht 0 zurückgeben, wenn der Rückgabewert als void definiert ist.
Ein gcc-Aufruf mit der Option -Wall sollte bei der Bereinigung helfen.
Josef
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
On 29.08.03 Tom Guder (tom-guder@web.de) 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!?
Dein Beispiel wirft bei mir eine Masse Warnings z.B.:
a.c:6: warning: previous implicit declaration of `rechne' a.c:11: warning: `rechne' was previously implicitly declared to return int'
Einfügen von "void rechne(float z, float y);" am Anfang behebt den Fehler (ohne die "). Merke: Funktionen die man benutzt immer deklarieren. Weiter: void als return-Wert einer Funktion ist nicht wirklich schön.
H.
Am Samstag, 30. August 2003 10:46 schrieb Hilmar Preusse:
On 29.08.03 Tom Guder (tom-guder@web.de) 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!?
Dein Beispiel wirft bei mir eine Masse Warnings z.B.:
a.c:6: warning: previous implicit declaration of `rechne' a.c:11: warning: `rechne' was previously implicitly declared to return int'
Einfügen von "void rechne(float z, float y);" am Anfang behebt den Fehler (ohne die "). Merke: Funktionen die man benutzt immer deklarieren.
Und wie deklariere ich die Funktion eher, wenn sie in einem anderen Modul steht? (Bin immer noch Newbee in C, bitte habt Geduld...)
Weiter: void als return-Wert einer Funktion ist nicht wirklich schön.
H.
On Mon, Sep 01, 2003 at 05:42:28PM +0200, Tom Guder wrote: Hi Tom,
Einfügen von "void rechne(float z, float y);" am Anfang behebt den Fehler (ohne die "). Merke: Funktionen die man benutzt immer deklarieren.
Und wie deklariere ich die Funktion eher, wenn sie in einem anderen Modul steht? (Bin immer noch Newbee in C, bitte habt Geduld...)
Dafür gibt es die Header-Dateien (*.h), die dann von allen .c-Dateien eingebunden werden, die diese Funktion benutzen möchten.
Ciao, Tobias
Am Montag, 1. September 2003 18:22 schrieb Tobias Koenig:
On Mon, Sep 01, 2003 at 05:42:28PM +0200, Tom Guder wrote: Hi Tom,
Einfügen von "void rechne(float z, float y);" am Anfang behebt den Fehler (ohne die "). Merke: Funktionen die man benutzt immer deklarieren.
Und wie deklariere ich die Funktion eher, wenn sie in einem anderen Modul steht? (Bin immer noch Newbee in C, bitte habt Geduld...)
Dafür gibt es die Header-Dateien (*.h), die dann von allen .c-Dateien eingebunden werden, die diese Funktion benutzen möchten.
Das heißt, ich sollte alle Funktionen, die ich in der Art benutze in Header Dateien schreiben?
Ciao, Tobias
On Mon, Sep 01, 2003 at 06:58:46PM +0200, Tom Guder wrote:
Am Montag, 1. September 2003 18:22 schrieb Tobias Koenig:
On Mon, Sep 01, 2003 at 05:42:28PM +0200, Tom Guder wrote: Hi Tom,
Einfügen von "void rechne(float z, float y);" am Anfang behebt den Fehler (ohne die "). Merke: Funktionen die man benutzt immer deklarieren.
Und wie deklariere ich die Funktion eher, wenn sie in einem anderen Modul steht? (Bin immer noch Newbee in C, bitte habt Geduld...)
Dafür gibt es die Header-Dateien (*.h), die dann von allen .c-Dateien eingebunden werden, die diese Funktion benutzen möchten.
Das heißt, ich sollte alle Funktionen, die ich in der Art benutze in Header Dateien schreiben?
Nur die Deklaration ( also 'void print( float, float );' ). Die Implementation kommt in eine .c Datei.
Schau dir einfach mal die Sourcen einiger Programme an, wie es andere Leute Machen.
Ciao, Tobias
On 01.09.03 Tom Guder (tom-guder@web.de) wrote:
Am Samstag, 30. August 2003 10:46 schrieb Hilmar Preusse:
On 29.08.03 Tom Guder (tom-guder@web.de) wrote:
Hallo!
Dein Beispiel wirft bei mir eine Masse Warnings z.B.:
a.c:6: warning: previous implicit declaration of `rechne' a.c:11: warning: `rechne' was previously implicitly declared to return int'
Einfügen von "void rechne(float z, float y);" am Anfang behebt den Fehler (ohne die "). Merke: Funktionen die man benutzt immer deklarieren.
Und wie deklariere ich die Funktion eher, wenn sie in einem anderen Modul steht? (Bin immer noch Newbee in C, bitte habt Geduld...)
Du willst sagen, Du benutzt in a.c eine Funktion, die in b.c implementiert wurde. Das stört gar nicht. Du mußt nur die Zeile eintragen. Es handelt sie nur um eine Deklaration an der sich der Compiler nicht stören wird. Erst wenn der Linker dann kein Object-File mit der Implementierung der Funktion findet wird er meckern. Wenn Du es einfacher haben willst, packst Du alle Deklarationen in ein eigenes Header-File und bindest dieses mittels #include "b.h" ein.
a.c:
#include "b.h"
void main(void) { float a = 0.41, b= 1.22; rechne(a, b); return 0; }
b.c:
void rechne(float z, float y) { printf("%f, %f", z, y); return 0; }
b.h:
void rechne(float z, float y);
drachi:[hille] >gcc -c b.c b.c: In function `rechne': b.c:4: warning: `return' with a value, in function returning void drachi:[hille] >gcc -c a.c a.c: In function `main': a.c:7: warning: `return' with a value, in function returning void a.c:4: warning: return type of `main' is not `int' drachi:[hille] >gcc a.o b.o drachi:[hille] >
Ich würde sagen Du schaust mal in ein Buch. Du scheinst totaler Anfänger zu sein, da sogar ich glaube die Fragen beantworten zu können.
H.
lug-dd@mailman.schlittermann.de