Forum: Compiler & IDEs problem mit atof()


von arrrrgproblemaaarrrggg (Gast)


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!

von hp-freund (Gast)


Lesenswert?

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...

von hp-freund (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

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)

von Walter (Gast)


Lesenswert?

arrrrgproblemaaarrrggg schrieb:
> %.3f

steht für float

von Walter (Gast)


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!

von hm (Gast)


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? :-(

von hp-freund (Gast)


Lesenswert?

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

von hm (Gast)


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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Stefan B. (stefan) Benutzerseite


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 :-(

von Rolf M. (rmagnus)


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.

von Nonsense (Gast)


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.

von hm (Gast)


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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Sayonara, damit bin ich raus.

von hm (Gast)


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!

von hm (Gast)


Lesenswert?

Stefan B. schrieb:
> Sayonara, damit bin ich raus.

Danke!

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von hm (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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)

von hm (Gast)


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.

von Karl H. (kbuchegg)


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.

von Rolf M. (rmagnus)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

von hm (Gast)


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!

von Ale (Gast)


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 ? ;-)

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
Noch kein Account? Hier anmelden.