float und GNU GCC (CodeBlocks)

Gast #1831051
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.
#1831073
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.
#1831076
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
#1831077
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
Gast #1831078
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren