www.mikrocontroller.net

Forum: Compiler & IDEs Probleme mit atof


Autor: Try (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe Probleme mit atof.
Ich möchte in meinen Atmega8 eine double Zahl, die ich über USART in
einen String einlese mit atof in eine double umwandeln um mit Ihr
weiter zurechnen.

double zahl;
...
zahl=atof("1");

Ich bekomme für den String "1" aber 1.626e+04 als Ergebnis.
Wo liegt mein Fehler?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal 1.0 probiert?
Ist aber nur geraten.

Autor: Try (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Idee, aber das Ergebnis ist das selbe.
Egal welchen Wert ich eingebe mit Punkt oder ohne der Wert liegt immer
in der Nähe von diesen Wert.
1 -> 1.626e+4
2 -> 1.638e+4
3 -> 1.645e+4
4 -> 1.651e+4
5 -> 1.654e+4

1.4241 -> 1.631e+4

Ich vermute das das eine Eigenart des Prozessor ist und mit der
Speicherverwaltung zusammen hängt.
Aber ich weiß es nicht.
Gruß Try

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche avr-libc Version?

Autor: Try (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die avr Version ist

avr-gcc (GCC) 3.3.2

Gruß
Try

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist die Compiler-Version, aber ich denke, Du hast die gleiche
avr-libc, die ich auch hier grad vor mir habe. Und bei der finde ich in
der stdlib.h (Version 1.14.2.3 vom 2004/03/08) folgenden Hinweis:

#if 0  /* not yet implemented */
[..]
extern double atof(const char *);
[..]
#endif

Damit wirst Du wohl wenig Erfolg haben. Du wirst Dir atof leider selber
bauen müssen.

Autor: Try (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis und die Hilfe.
Dan muss ich die Vor und Nachkommastelle doch getrennt verarbeiten.

Gruß Try

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla, Oldbug, schreibe mal bitte einen Bugreport dafür auf der
avr-libc Homepage.

Nein, atof() gibt's, sonst hätte es ja auch einen Linkerfehler
gegeben.  Ist am Ende ein Kurzschluß auf die Standardfunktion strtod()
(da es nur drei Assemblerbefehle sind, ist das sogar im gleichen
Sourcefile implementiert, d. h. wenn man strtod() benutzt, bekommt man
immer auch gleich atof() mit).

Wenn's unbedingt atof() sein soll, einfach vorerst mal im eigenen
Sourcecode entsprechend deklarieren.  Das Problem entsteht nur daraus,
daß in der Quelle atof() nicht deklariert ist, so daß der Compiler es
implizit als einen `int' zurückgebend annimmt.  (Darüber sollte er
eigentlich auch 'ne Warnung von sich geben...)

Autor: Try (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis und die Hilfe.
Ich werde strtod() benutzen.
Ich habe nicht an diese Funktion gedacht.

Gruß Try

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Bug ist im CVS repariert (sowohl im HEAD als auch im
avr-libc-1_0-branch).

Autor: Try (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Gruß Try

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.