Problem mit dtostrf

Gast #6534
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
Gast #6537
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
Gast #6539
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()).
Gast #6540
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
Gast #6541
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).
Gast #6542
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
Gast #6543
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.
Gast #6545
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)
Gast #6547
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
Gast #6549
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)
Gast #6550
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

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