www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit dtostrf


Autor: Chris Blues (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich wieder ;-)
nachdem sich nach meiner Compilerumstellung auch der Befehl "dtostrf" 
kompilieren lässt, müsste er eigentlich nur noch funktionieren. In einem 
kleinen Beispielprogramm tut er das auch.
Eingesetzt in ein umfangreicheres Programm produziert er trotz korrekter 
Datentypen (double und char) nur eine Ausgabe wie diese:
<-?-> 2.2e+
Eigentlich sollte da "110.0" stehen.
Irgendeine Idee?

Gruß,
Chris

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das wird wohl ein syntax problem sein...poste mal den code

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz davon abgesehen: dtostrf() sollte nie ein "e+..."
erzeugen.

Autor: Chris Blues (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@BAB:
über 500 Zeilen... da gehts um keinen festen Code-Abschnitt, denn 
eigentlich müsste es stimmen, jedes kleine Test-Programm funktioniert... 
ich dachte eher daran, dass es bekannte Probleme damit gibt... 
anscheinend nicht

@ Jörg:
genau das dachte ich mir auch... manchmal kommen auch einfach nur 
Zeichen, als ob gar kein dtostrf im Spiel wäre, also wie Hex, dann 
100erte von "ß"...

Chris

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn viel Mist daher kommt liegt das oftmals an einem Stack-Overflow.

Gruss
Christian

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder ein buffer overflow mit dtostrf() selbst.  Einer der
wesentlichen Nachteile dieser Funktion ist, daß man die benötigte
Puffergröße nicht vorausbestimmen kann und beim Aufruf auch nicht
sagen kann, wieviel Bytes reserviert worden sind (à la snprintf()).

Autor: Chris Blues (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seltsam ist nur, dass es bei einem Testprogramm, bei dem die beiden 
Zahlen, aus denen der Wert berechnet wird, einfach im Programm als 
Konstanten eingegeben werden, der Wert anstandslos als Kommazahl mit 
dtosstrf ausgegeben wird. Und das nur, weil das Testprogramm so schön 
kurz ist? Ist dtosstrf schlichtweg faul??? ;-)
Ersetze ich dtosstrf im eigentlichem Programm mit itoa funktioniert es 
übrigens, d.h. berechnet wird alles richtig und meine Eingaberoutinen 
funktionieren auch (nur ich brauch halt den Kommawert...).

Chris

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dtostrf() ist nach meiner Erfahrung nicht foul.  dtostre() hatte einige
Bugs, aber die habe ich vor geraumer Zeit gefixt.

Wenn Du ein Testprogramm hast, daß einen Bug vermuten läßt, sehe ich es
mir aber gern mal an (private Mail dann bitte).

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi joerg,

du sagtest:

Einer der
wesentlichen Nachteile dieser Funktion ist, daß man die benötigte
Puffergröße nicht vorausbestimmen kann....

wieso ? ich bin als benutzer der funktion doch selber für die 
speichergrösse- und art verantwortlich...oder meinst du generell die 
interne verabeitung der dtostrf() funktion?

gruss,

BAB

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau.  Gerade bei der %f-artigen Konvertierung müßtest Du doch zuvor
die Zahl analysieren um zu wissen, ob da nicht am Ende
-134133834834734643632843248838438934834843934934943943
oder so etwas herauskäme. ;-)  Wenn Du einfach nur annimmst, daß Deine
Gleitkommazahl ,,zwischen 0 und 30'' liegt und dann irgendein anderes
Problem sie überlaufen läßt, riskierst Du einen Crash.

Bei dtostre() ist das etwas einfacher.

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yo alles klar..jetzt verstehe ich was du meinst..

thx.

BAB

Autor: Reiner Patommel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein kleines Problem existiert hier:
dtostrf macht genau das Gleiche wie sprintf.
Wenn der Parameter width nicht passt kann einiges schief gehen.
Beispiel:
n = 12345.6789
dtostrf(n, 4, 1, string) truncated nicht auf 1234 sondern gibt das 
gesamte Resultat aus:
12345.6789xxxxx
Das gleiche Ergebnis bekommt man mit dtostrf(n, 0, 1, string)
dtostrf(n, 100,1, string) füllt noch mit Nullen auf, d.h. verlangt einen 
String von 102 Bytes.
width:  (-) + Anzahl der Vorkommastellen + Dezimalpunkt + Anzahl der 
Nachkommastellen!
Stringlänge: width + 1 (wegen der \0)

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der einzige Vorteil der printf()-Form ist aber, daß es auch ein
snprintf() gibt.;-)

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

meiner Information nach sollte die "dtostrf" Fkt. standartmäßig in
der stdlib.h stehen und somit genutzt werden können. Leider ist diese
in meiner nicht implementiert. Ich nutze CodeVision und mir ist schon
öfters aufgefallen das da einige Sachen fehlen (Freeversion).
Wenn mir jemand sagen könnte, wo ich eine möglichst komplette Standart
"include Sammlung" herbekomme, würde er mir sehr helfen.
Ich bin nur am zusammen suchen irgendwelcher Include-Dateien :(


Gruß und Dank

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz tolle Idee!

Und woher kommt der Code, der zu den Headerfiles gehört?

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo OldBug

der Code ist ein eigener, ich hab mal google gefragt, wie ich zum Bsp.
eine double in einen Srring umwandeln kann, siehe da, da bin ich auf
die "dtostrf" Fkt. gestoßen. Es wurde geschrieben wo ich diese finden
kann(stdlib.h) -> kurzerhand eingebunden -> nicht verfügbar ->
weitergesucht -> oh, eine stdlib.h mit dtostrf() gefunden!!!-> wieder
kurzerhand eingebunden -> wird erkannt aber:( "#include <stddef.h>"
in stdlib.h nicht gefunden usw. usw....

wäre Super, wenn Du eine

"Ganz tolle Idee!"

hättest, was ich in meiner Arbeitsweise wie oben dargestellt falsch
mache, oder aber mir eine Quelle zeigen könntest, in der ich für
CodeVision / AVRs passende libs finde

Gruß Mike

fals du den Code der *.h meinst die da sind, die sind direkt
mitgeliefert (CodeVision)

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird Dir nicht helfen, wenn Du einfach nur irgendwelche Headerfiles
benutzt, so lange Du die dazu passenden Objects bzw. Libraries nicht
hast! Der Compiler wird dann zwar nicht mehr meckern, dafür aber der
Linker umso mehr!

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.