Forum: PC-Programmierung float und GNU GCC (CodeBlocks)


von float (Gast)


Lesenswert?

Hi,

ich verwende CodeBlocks unter Windows und hab' da irgendwie mit dem 
Datentyp float Probleme.

Mein kleines Testprogramm sieht so aus:
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
int main()
5
{
6
7
    add_double(12.5, 13.3);
8
    add_float(12.5, 13.3);
9
    return 0;
10
}
11
12
13
void add_double(double zahl1, double zahl2){
14
    printf("Summe double = %f", (zahl1+zahl2)); //hier wird 25.8 ausgegeben - passt also 
15
    //return (zahl1 + zahl2);
16
}
17
18
void add_float(float zahl1, float zahl2){
19
     printf("Summe float = %f", (zahl1+zahl2)); //hier wird 2.640625 ausgegeben - passt nicht! 
20
}

Weiß jemand warum das so ist? Als Compiler ist übrigens der GNU GCC in 
CodeBlocks eingetragen.

von Klaus W. (mfgkw)


Lesenswert?

1. Funktionen deklarieren vor der Verwendung
2. Wenn man 1. nicht beachtet, dann wenigstens mit -Wall
   übersetzen und dei Warnungen des Compilers lesen und beachten.


Dann klappt es auch.

von Klaus W. (mfgkw)


Lesenswert?

Was passiert ist folgendes:

Die beiden Funktionen sind nicht deklariert.

Erst nimmt der Compiler beim Aufruf an, daß jeweils
double übergeben wird (bei add_double weil du es so hinschreibst,
und bei add_float, weil du zwar float hinschreibst, die aber
beim Aufruf von Funktionen defaultmäßig als double übergeben
werden).

Also werden double übergeben, auch bei add_float.

Die Funktion selbst erwartet aber nur float.
Wenn der Compiler das merkt, ist es aber zu spät - der
Aufruf ist schon kompiliert.

=> Deklarieren hilft, und die Warnungen des Compilers
sind immer eine Überlegung wert.

von float (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> 1. Funktionen deklarieren vor der Verwendung

Danke, hat geklappt.

Hatte bisher keinerlei Erfahrung mit dem GCC, der Compiler den ich 
vorher hatte hat über die fehlende Deklaration hinweggesehen. Darum 
hätte ich den Fehler niemals dort vermutet.

von Klaus W. (mfgkw)


Lesenswert?

Hier noch die Warnungen, die du ignoriert hast:
1
klaus@i4a:~ > gcc -Wall t.c
2
t.c: In function ‘main’:
3
t.c:7: warning: implicit declaration of function ‘add_double’
4
t.c:8: warning: implicit declaration of function ‘add_float’
5
t.c: At top level:
6
t.c:13: warning: conflicting types for ‘add_double’
7
t.c:7: warning: previous implicit declaration of ‘add_double’ was here
8
t.c:18: warning: conflicting types for ‘add_float’
9
t.c:8: warning: previous implicit declaration of ‘add_float’ was here

von Mark B. (markbrandis)


Lesenswert?

Hm, bei mir sind es nicht nur warnings sondern gar errors:
1
gcc -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ..\main.c
2
..\main.c: In function `main':
3
..\main.c:7: warning: implicit declaration of function `add_double'
4
..\main.c:8: warning: implicit declaration of function `add_float'
5
..\main.c: At top level:
6
..\main.c:12: error: conflicting types for 'add_double'
7
..\main.c:7: error: previous implicit declaration of 'add_double' was here
8
..\main.c:17: error: conflicting types for 'add_float'
9
..\main.c:8: error: previous implicit declaration of 'add_float' was here
10
Build error occurred, build is stopped

von float (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Erst nimmt der Compiler beim Aufruf an, daß jeweils
> double übergeben wird (bei add_double weil du es so hinschreibst,
> und bei add_float, weil du zwar float hinschreibst, die aber
> beim Aufruf von Funktionen defaultmäßig als double übergeben
> werden).

Achso, jetzt ist mir das klar.
Danke für die Erklärung.

Klaus Wachtler schrieb:
> => Deklarieren hilft, und die Warnungen des Compilers
> sind immer eine Überlegung wert.

Danke, die werd ich gleich mal einschalten.

von Mark B. (markbrandis)


Lesenswert?

Ach Mann, immer diese idiotische 
15-Minuten-oder-anderer-Post-schon-da-Regel. Ich wollte noch sagen, dass 
ich Eclipse verwende und es vielleicht an den Einstellungen liegt, dass 
bei mir etwas ein "error" ist und beim Threadersteller eine "warning".

von Rolf Magnus (Gast)


Lesenswert?

Selbst komplett ohne Warning-Optionen kommen da bei mir Warnungen, die 
einen Hinweis auf das Problem liefern.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.