-- 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!
Hast Du die stdlib.h und math.h eingebunden? So klappts:
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <math.h> |
4 | |
5 | int main(void) { |
6 | char ausgabe[20]; |
7 | char zahl[]="2.123"; |
8 | double n = atof (zahl); |
9 | float j= (float)n; |
10 | sprintf(ausgabe, "%.3f", j); |
11 | printf("zahl\t: %s\nn\t: %f\nausgabe\t: %s\nj\t: %f\n",zahl,n,ausgabe,j); |
12 | //uart_puts(ausgabe);
|
13 | return 0; |
14 | }
|
Manchmal ist es von Vorteil die gesamte Datei anzuhängen...
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)
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!
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? :-(
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.
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.
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.
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 :-(
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.
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.
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.
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!
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.
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.
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.
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)
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.
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.
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.
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.
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.
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!
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 ? ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.