Problem mit _gcvt_s() bei bestimmten Werten
-
Ich habe eine kleine Funktion geschrieben, die einen Wert vom Typ float ausliest und mir einen String ausgibt. Die Basis dieser Funktion ist _gcvt_s, mit dessen Ergebnis dann weitergearbeitet wird. Bei manchen speziellen Werten scheint diese Funktion, so wie ich sie eingebaut habe, aber nicht zu funktionieren. Mithilfe von MessageBoxes konnte ich die Fehlerstelle genau darauf festlegen.
Die Genaue Codezeile bei mir lautet:
_gcvt_s(output, 9, input, 6);Wobei output ein Array von chars mit statischer Länge 29 ist und input ein eingegebener Float-Wert. Für die getestete Werte wie 0, 1 und 0.123456 funktioniert alles, aber nun habe ich mit Werten wie 0.001 oder 0.01 gearbeitet und es scheint Probleme zu geben. Welcher Art kann ich nicht genau sagen (das Programm ist ein Plugin für 3ds Max, welches mir einfach an der Stelle eine unspezifische Fehlermeldung ausgibt).
Vielleicht fällt ja jemandem mit mehr Erfahrung in dem Gebiet eventuell auf, woran es liegen könnte.
-
Ohne die Funktion zu kennen, könnte man jetzt nur raten.
Du müsstest schon nähere Angaben machen:
Was macht die Funktion _gcvt_s genau, welchen Rückgabewert hat _gcvt_s usw.Gruß,
p.
-
Die Funktion _gcvt_s ist nicht von mir geschrieben, sondern nur Teil meiner größeren Funktion, die anschließend mit dem Output von _gcvt_s noch weiter arbeitet. _gcvt_s selbst soll einen Float-Wert zu einem Array von chars machen. Siehe auch MSDN für weitere Informationen darüber.
-
Ja, aber nichtsdestotrotz müsste ich ins Innenleben von _gcvt_s blicken können, damit ich dir weiterhelfen kann.
Gruß,
p.
-
Ich habe doch keine Ahnung, wie das Teil intern funktioniert. Ich weiß nur das, was der Artikel im MSDN darüber sagt.
Konnte das ganze aber mittlerweile anders lösen, nämlich indem ich einfach sprintf genommen habe mit einfach nur einem Formatstring von "%f". Das funktioniert super.
-
Tja, ich habe angenommen, das die Funktion _gcvt_s intern _gcvt aufruft,
denn in der MSDN fand ich nur _gcvt.Na, wie auch immer, Hauptsache du hast es hingekriegt

-
Nein, _gcvt_s ist die überlaufgeschützte Version von _gcvt. Ich schätze mal, das _s steht für "save". Da gibst du nur noch eine Länge an, die der Buffer hat, in den geschrieben wird und das Teil überprüft, ob das auch da rein passt. Kann aber durchaus sein, dass intern von _gcvt_s aus auch _gcvt aufgerufen wird, ist ja nicht ganz so abwegig.
