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
@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
Wenn viel Mist daher kommt liegt das oftmals an einem Stack-Overflow. Gruss Christian
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()).
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
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).
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
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.
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)
Der einzige Vorteil der printf()-Form ist aber, daß es auch ein snprintf() gibt.;-)
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.