mikrocontroller.net

Forum: Compiler & IDEs problem mit atof()


Autor: arrrrgproblemaaarrrggg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-- mein code --

char zahl[]="2.123";
double n = atof (zahl);
float j= (float)n;
//j=2.345;
sprintf(ausgabe, "%.3f", j);
uart_puts(ausgabe);

als ergebnis erhalte ich dann:

16391.000

wtf???

irgendwie wandelt atof das char array nicht korrekt in einen double wert 
um :-(

danke!

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du die stdlib.h und math.h eingebunden?
So klappts:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void) {
  char ausgabe[20];
  char zahl[]="2.123";
  double n = atof (zahl);
  float j= (float)n;
  sprintf(ausgabe, "%.3f", j);
  printf("zahl\t: %s\nn\t: %f\nausgabe\t: %s\nj\t: %f\n",zahl,n,ausgabe,j);
  //uart_puts(ausgabe);
  return 0;
}

Manchmal ist es von Vorteil die gesamte Datei anzuhängen...

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerade noch gesehen: math.h ist für atof nicht erforderlich.

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir kein Fehler.

WinAVR-20081205
_AVR_LIBC_VERSION_STRING_ "1.6.4"

Build started 8.1.2011 at 01:32:34
AVR-GCC.EXE  -mmcu=atmega8 -Wall -gdwarf-2 -DF_CPU=8000000UL -Os 
-fsigned-char -MD -MP -MT test_atof.o -MF dep/test_atof.o.d  -c 
../test_atof.c
../test_atof.c: In function 'main':
../test_atof.c:12: warning: format '%.3f' expects type 'double', but 
argument 3 has type 'float'
../test_atof.c:14: warning: control reaches end of non-void function
AVR-GCC.EXE -mmcu=atmega8 -Wl,-u,vfprintf test_atof.o    -lm 
-lprintf_flt  -o test_atof.elf
avr-objcopy -O ihex -R .eeprom  test_atof.elf test_atof.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 -O ihex test_atof.elf test_atof.eep
d:\WinAVR\BIN\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 
never used

AVR Memory Usage
----------------
Device: atmega8

Program:    4560 bytes (55.7% Full)
(.text + .data + .bootloader)

Data:         37 bytes (3.6% Full)
(.data + .bss + .noinit)

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
arrrrgproblemaaarrrggg schrieb:
> %.3f

steht für float

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> ../test_atof.c:12: warning: format '%.3f' expects type 'double', but
> argument 3 has type 'float'

man sollte Warnungen nicht ignorieren, so eine schon gar nicht!

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter schrieb:
> man sollte Warnungen nicht ignorieren, so eine schon gar nicht!

Ist doch egal, er schrieb doch kein Fehler.
Hat denn keiner ne Idee? :-(

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, wie jetzt?
Lesen lernen?
Hobby wechseln?

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hp-freund schrieb:
> Äh, wie jetzt?
> Lesen lernen?
> Hobby wechseln?

Troll??? Das Problem ist immer noch nicht gelöst.
Von deinem unnötigem Quellcode und "math.h" (lol!) und sinnlosen Fragen 
wird auch nichts besser Du verschendest blos meine Zeit.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm schrieb:
> Walter schrieb:
>> man sollte Warnungen nicht ignorieren, so eine schon gar nicht!
>
> Ist doch egal, er schrieb doch kein Fehler.

Du musst noch viel lernen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hp-freund schrieb:
> Hast Du die stdlib.h und math.h eingebunden?
> So klappts:

Zähl mal zusammen, wieviele Zeichen da so ungefähr beim sprintf zusammen 
kommen werden und dann schau dir die Array-Definition noch einmal an.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm schrieb:

>> Ist doch egal, er schrieb doch kein Fehler.
>> Hat denn keiner ne Idee? :-(

Wenn dir die Lösung wichtig ist, dann liegt es an dir, genügend Infos zu 
geben, damit man den Fehler reproduzieren kann. Deine bisherigen Infos 
reichen dafür nicht aus.

Mit deinen bisherigen Infos plus notwendigen und gezeigten Ergänzungen, 
weil dein Code allein nicht lauffähig ist, können von anderen Programme 
für ein universelles und ein spezielles Target erstellt werden, die 
richtig funktionieren.

Der Fehler liegt also in einem von dir nicht gezeigten Detail.

> Troll??? Das Problem ist immer noch nicht gelöst.
> Von deinem unnötigem Quellcode und "math.h" (lol!) und sinnlosen Fragen
> wird auch nichts besser Du verschendest blos meine Zeit.

Ich meine wahrscheinlich auch :-(

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm schrieb:
> Troll??? Das Problem ist immer noch nicht gelöst.
> Von deinem unnötigem Quellcode und "math.h" (lol!) und sinnlosen Fragen
> wird auch nichts besser Du verschendest blos meine Zeit.

Du solltest mal deine Arroganz ablegen und Hinweise anderer und die des 
Compilers nicht ignorieren. Außerdem ein kompletes Programm posten, das 
den Fehler zeigt, statt nur ein paar hingerotzte Code-Fragmente.
Wer Hilfe sucht und dabei so pampig ist, verdient eigentlich keine 
Antwort.

Autor: Nonsense (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm schrieb:
> Troll??? Das Problem ist immer noch nicht gelöst.
> Von deinem unnötigem Quellcode und "math.h" (lol!) und sinnlosen Fragen
> wird auch nichts besser Du verschendest blos meine Zeit.

Und du unsere.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Wer Hilfe sucht und dabei so pampig ist, verdient eigentlich keine
> Antwort.

Wer bist Du denn bitte? Meine Reaktion war völlig angemessen auf 
Bemerkungen
wie

"Äh, wie jetzt?
Lesen lernen?
Hobby wechseln?"

Sowas ist einfach Schwachsinn. Vor allem vor dem Hintergrund seiner 
Vorpostings, die nur meine Zeit verschwenden.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sayonara, damit bin ich raus.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Zähl mal zusammen, wieviele Zeichen da so ungefähr beim sprintf zusammen
> kommen werden und dann schau dir die Array-Definition noch einmal an.

Guck mal die Zeile "//j=2.345;"

Das hatte ich zum Test eingebaut. Wenn der float im Code direkt 
definiert wird ist alles ok.
Der Fehler tritt also schon an der Stelle

char zahl[]="2.123";
double n = atof (zahl);
float j= (float)n;

also bei atof oder beim float casten auf. Das sprintf tut was es soll.

MfG!

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> Sayonara, damit bin ich raus.

Danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm schrieb:

> Der Fehler tritt also schon an der Stelle

Dein Fehler ist hier von niemandem reproduzierbar.
Hauptsächlich deshalb, weil du kein komplettes Progamm postest, sondern 
aussagenlose Fragmente aus denen man nicht spezifisches entnehmen kann.

> char zahl[]="2.123";
> double n = atof (zahl);
> float j= (float)n;
>
> also bei atof oder beim float casten auf.

wetten nicht.
Du siehst die Symptome und verwechselst sie mit der Ursache. Das ist 
alles.
Wenn du endlich ein komplettes Programm posten würdest, könnte man 
besser analysieren, was faul ist.

Denn des öfteren steckt der Fehler eben nicht dort, wo du ihn vermutest, 
sondern ganz woanders.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> hp-freund schrieb:
>> Hast Du die stdlib.h und math.h eingebunden?
>> So klappts:
>
> Zähl mal zusammen, wieviele Zeichen da so ungefähr beim sprintf zusammen
> kommen werden und dann schau dir die Array-Definition noch einmal an.

Tut mir leid hp-freund.
Ich hab beim lesen den sprintf mit dem printf durcheinandergewürfelt. 
Die Buffergröße beim sprintf ist natürlich ok.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Wenn du endlich ein komplettes Programm posten würdest, könnte man
> besser analysieren, was faul ist.

Das geht leider nicht, aber werde am Montag mal eine Minimalprogramm 
testen und debuggen.

Dachte es handelt sich hier um irgendeinen Käsefehler, der schnell 
beantwortet ist.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
arrrrgproblemaaarrrggg schrieb:
> float j= (float)n;
> //j=2.345;
> sprintf(ausgabe, "%.3f", j);

Welchen Datentyp erwartet (s)printf bei Angabe
des Formatspezifizierers %f?

   %f spezifiziert double.

Welchen Datentyp übergibst Du hier?

   float.

Was geht in die Hose? sprintf nimmt sich einen double vom Stack, 
auch wenn da keiner steht. Also wird Dein float mit irgendwelchem 
Krempel gemischt und das Resultat als double interpretiert.

Probier mal

> sprintf(ausgabe, "%.3f", n);

aus und lass die Umwandlung zu float einfach weg.


(Wenn Du allerdings einen Compiler verwendest, für den double 
dasselbel ist wie float, wie z.B. beim AVRGCC, dann liegt ein komplett 
anders geartetes Problem vor)

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:
> aus und lass die Umwandlung zu float einfach weg.

langsam, ich wiederhole mich.
mit j=2.345; funktioniert alles. also kein problem mit sprintf.
und ja avrgcc.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:

> (Wenn Du allerdings einen Compiler verwendest, für den /double/
> dasselbel ist wie float, wie z.B. beim AVRGCC, dann liegt ein komplett
> anders geartetes Problem vor)

Rufus du verrennst dich hier.
Die Warnung ist zwar nett, aber unnötig, da bei variadischen Funktionen 
ein float sowieso automatisch auf einen double promoted wird. Das hat 
sich m.W. auch in C99 nicht geändert.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm schrieb:
> Sowas ist einfach Schwachsinn. Vor allem vor dem Hintergrund seiner
> Vorpostings, die nur meine Zeit verschwenden.

Sie verschwenden nur deshalb deine Zeit, weil du nicht verstanden hast, 
warum sie geschrieben wurden.
Andere haben sich die Mühe gemacht, aus deinem Code-Fragement ein 
komplettes Programm zu bauen und auszuprobieren und haben festgestellt, 
daß es funktioniert. Also kann es nur zwei Möglichkeiten geben: Entweder 
deine Compiler-Installation ist kaputt, oder der Fehler ergibt sich erst 
durch Teile des Programms, die du uns verheimlichst.
Das allermindeste, was du hättest tun können, wäre entweder ein 
minimales, aber komplettes Programm zu posten, bei dem der Fehler 
auftritt, so daß andere ihn nachstellen können, oder eines der Programme 
der anderen ausprobieren und schauen, ob es bei dir auch den Fehler 
erzeugt.
Was du stattdessen gemacht hast, ist Leute hier zu verärgern, so daß sie 
keine Lust mehr haben, dir zu helfen.

Rufus Τ. Firefly schrieb:
> Was geht in die Hose? sprintf nimmt sich einen double vom Stack,
> auch wenn da keiner steht.

So einfach ist es dann doch nicht. Bei variablen Argumentlisten wird 
float automatisch nach double konvertiert.

Ich hab mal meine Glaskugel angeworfen, und sie meint, es liegt, wie 
schon in der allerersten Antwort vermutet, an einem nicht inkludierten 
Header (plus ignorierter Warnung), so daß der Compiler implizit annimmt, 
daß atof() int zurückgibt.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Rufus Τ. Firefly schrieb:
>
>> (Wenn Du allerdings einen Compiler verwendest, für den /double/
>> dasselbel ist wie float, wie z.B. beim AVRGCC, dann liegt ein komplett
>> anders geartetes Problem vor)
>
> Rufus du verrennst dich hier.

OK, dann streiche meinen Beitrag.

Mir erschien das hin- und her-casten nur etwas wirr und unnötig.

Deine Glaskugelvermutung dürfte (wie so oft) ins Schwarze treffen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:

> Mir erschien das hin- und her-casten nur etwas wirr und unnötig.

das sowieso.

> Deine Glaskugelvermutung dürfte (wie so oft) ins Schwarze treffen.
Ich denke Rolf hats geknackt.

hm hat ja schon hinlänglich gezeigt, dass ihn Warnungen nicht 
interessieren. Das von Rolf skizzierte Szenario ist eine mögliche und 
sehr plausible Variante dessen, was schief gelaufen sein könnte.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Was du stattdessen gemacht hast, ist Leute hier zu verärgern, so daß sie
> keine Lust mehr haben, dir zu helfen.

Ich versteh deine Kritik, wie gesagt, ich ging von einem Käsefehler aus 
und hab noch kein Minimaprogramm getestet, sonst hätte ich das gepostet.

Ferner kreidest Du mir an das ich auf

"Äh, wie jetzt?
Lesen lernen?
Hobby wechseln?"

entsprechend reagiere. Dazu sag ich nur "wie man in den Wald ruft"
Wenn das irgendwen verägert, ist mir das auf gut deutsch gesagt s.... 
egal Ich habe genug Freunde.

MfG!

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm:

Du hast nicht gesagt was für ein Kompiler nutzt oder welche uC....
Bist du sicher daß double and float sind nicht gleich ? (4 byte).... Du 
kannst einfach deine Variabel verfolgen... und 4 hex bytes per UART 
senden und sehen wo es überschrieben ist... (oder gar nicht 
initializiert).

Heute ist Mittwoch :) Wo ist die Quellcode ? ;-)

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.