Forum: Compiler & IDEs Problem mit dtostrf


von Chris Blues (Gast)


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

von BAB (Gast)


Lesenswert?

das wird wohl ein syntax problem sein...poste mal den code

von Joerg Wunsch (Gast)


Lesenswert?

Ganz davon abgesehen: dtostrf() sollte nie ein "e+..."
erzeugen.

von Chris Blues (Gast)


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

von Christian Schifferle (Gast)


Lesenswert?

Wenn viel Mist daher kommt liegt das oftmals an einem Stack-Overflow.

Gruss
Christian

von Joerg Wunsch (Gast)


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

von Chris Blues (Gast)


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

von Joerg Wunsch (Gast)


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

von BAB (Gast)


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

von Joerg Wunsch (Gast)


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.

von BAB (Gast)


Lesenswert?

yo alles klar..jetzt verstehe ich was du meinst..

thx.

BAB

von Reiner Patommel (Gast)


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)

von Joerg Wunsch (Gast)


Lesenswert?

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

von Mike (Gast)


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

von OldBug (Gast)


Lesenswert?

Ganz tolle Idee!

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

von Mike (Gast)


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)

von OldBug (Gast)


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!

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.