mikrocontroller.net

Forum: Compiler & IDEs Komisches Verhalten von printf


Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich bin beim programmieren zufällig auf folgendes Problem gestoßen:
Beim Ausführen dieses Codes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int var;

int main( ){

  printf("%f\n", 2345.0f);

  var = 6;
  printf("%f\n", var);
  printf("%i\n", var);


  system("PAUSE");
  return 0;

}

kommt das unerwartete Ergebniss: 2345 \n 2345 \n 6    raus. Eigentlich 
hätte ich 2345 \n 0 \n 6   oder ähnliches erwartet.
Wie kommt soetwas?

Gruß, Yaro

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups....falsches unterforum......
Ich poste das lieber in "Pc-programmierung"....
Kann man Beiträge löschen?

sorry....

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei
  printf("%f\n", var);
wobei var ein int ist, ist das Ergebnis undefiniert, es kann alles 
passieren.  Auch dass die CPU ihre Elektronen in Marsch setzt, um den 
Stecker zu ziehen.

Aber auch 2345 ist schon ein schönes undefiniertes Ergebnis.  Was willst 
Du mehr?

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hättest Du mal die Warnings gelesen, die Dir der Compiler auspuckt, da 
steht die Lösung:
$ gcc -Wall printf-test.c -o printf-test
printf-test.c: In function ‘main’:
printf-test.c:10: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

Das Verhalten von printf ist dadurch dadort undefiniert, da könnte 
genausogut Grützewütze bei rauskommen. Wenn man aber - die Warnung 
behebend - den Code auf
printf("%f\n", (double)var);
ändert, dann kommt auch die erwartete Ausgabe
2345.000000
6.000000
6

HTH und HF und Du hast hoffentlich was daraus gelernt [1] :-)

[1] Lerninhalt: -Wall regelt, der Compiler meckert fast immer Zurecht 
und gibt manchmal sogar die richtige Fehlerstelle mit an ;-)

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist ja, dass mein Compiler nicht mal gemeckert hat...
Hab wohl einen zu alten...

aber naja, dann hat sich das ja wohl geklärt.

Gruß, Yaro

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das Problem ist ja, dass mein Compiler nicht mal gemeckert hat...

Kein GCC? Oder Warnungen nicht eingeschaltet?

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch... GCC... Warnungen eingeschaltet...

Habe jetzt aber nochmal geguckt, der zeigt mir tatsächlich keine 
Warnungen an. Benutze wx-Dev-Cpp zum programmieren auf dem PC, 
normalerweise programmiere ich Mikrocontroller (mit Code Blocks).

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es jetzt!
Musste bei den zusätzlichen kommandozeilen-Optionen -Wall hinzufügen, um 
Warnungen anzustellen.

Vielen Dank für eure Hilfe!
Gruß, Yaro

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also doch Warnungen nicht eingeschaltet. Wenn du dabei bist, schalt noch
-pedantic und -Wextra dazu.

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach ich =)

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.