www.mikrocontroller.net

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


Autor: float (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Mein kleines Testprogramm sieht so aus:
#include <stdio.h>
#include <stdlib.h>

int main()
{

    add_double(12.5, 13.3);
    add_float(12.5, 13.3);
    return 0;
}


void add_double(double zahl1, double zahl2){
    printf("Summe double = %f", (zahl1+zahl2)); //hier wird 25.8 ausgegeben - passt also 
    //return (zahl1 + zahl2);
}

void add_float(float zahl1, float zahl2){
     printf("Summe float = %f", (zahl1+zahl2)); //hier wird 2.640625 ausgegeben - passt nicht! 
}

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: float (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Mark Brandis (markbrandis)
Datum:

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

Autor: float (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Rolf Magnus (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.