problem mit atof()

Gast #2005676
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!
Gast #2006227
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...
Persönliche Seite #2006241
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)
Angehängte Dateien:
Persönliche Seite #2006561
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 :-(
#2006576
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.
Gast #2006605
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.
Gast #2006616
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!
#2006685
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.
#2006694
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.
Persönliche Seite #2006737
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)
#2006787
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.
#2006801
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.
Persönliche Seite #2006823
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.
#2006847
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.
Gast #2006989
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!
Gast #2012896
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren