funktion erstellen, die float in string umwandelt
-
aus einer berechnung wird das float-array "ergebnis" zurückgegeben. diese einzelnen ergebnisse sollen in bestimmte input-felder ausgegeben werden (z.b. hier nach Input_p_st). dafür müssen die zahlen in strings konvertiert werden, dazu habe ich die gvct-funktion gefunden.
char Buffer[20]; gcvt(Ergebnis[1], 20, Buffer); Input_p_st->value(Buffer);
für diesen vorgang würde ich am liebsten eine eigene funktion schreiben, so dass ich nachher nur noch sowas wie Input_p_st->value(FloatToStr(Ergebnis[1]) schreiben muss.
die value-memberfunktion eines Inputs möchte aber eben einen const char * haben. wie muss also diese FloatToStr aussehen? und der aufruf?für die graphische oberfläche nutze ich übrigens fltk, aber das ist ja hier nicht das ausschlaggebende
-
dall schrieb:
char Buffer[20]; gcvt(Ergebnis[1], 20, Buffer); ...
also hier sollte besser keine 20 stehen:
gcvt(Ergebnis[1], 20, Buffer);
sondernsizeof(Buffer)-3
oder sowas, du brauchst platz für ein vorzeichen, einen dezimalpunkt und die 0 am stringende.
ansonsten: lass es doch so.
-
vielen dank
aber bei 9 verschiedenen input-feldern ist das so ein furchtbarer bandwurm. kann man da nicht was machen?
-
Packs in eine Funktion die dir einen string zurück gibt.
-
verrückt! an sowas hatte ich auch schon gedacht, hab's jetzt mal richtig ausprobiert:
string FloatToStr(float FloatZahl) { char Buffer[20]; gcvt(FloatZahl, sizeof(Buffer)-3, Buffer); string StrBuf = Buffer; return StrBuf; }
beim aufruf muss ich jetzt nur noch in einen c-string umwandeln:
Input_p_L->value(FloatToStr(Ergebnis[1]).c_str());
und es funktioniert tatsächlich! vielen dank!
-
dall schrieb:
string FloatToStr(float FloatZahl) { char Buffer[20]; gcvt(FloatZahl, sizeof(Buffer)-3, Buffer); string StrBuf = Buffer; return StrBuf; }
*räusper*
du gibst ein lokales objekt zurück. ist reine glückssache wenn's klappen sollte. workaround: mach Buffer 'static'.
besser: übergib der funktion den string, den sie befüllen soll.
^^was ist überhaupt 'string'? ein typedef für char*?
-
uaah, hab mir schon gedacht, dass ich mich jetzt irgendwie blamiere
aber gut, fang ich erstmal mit der rechtfertigung an ^^
daran, den zu befüllen string mit zu übergeben, hatte ich auch schon gedacht, aber das würde beim aufruf dann ja wieder mehr zeilen bedeuten, oder nicht?
und wieso ist es glückssache, wenn ich ein lokales objekt zurückgebe? ich fange den rückgabewert doch dann ab, oder wie meintest du das?
wenn ich buffer static mache, dann kann ich den pointer doch auch zurückgeben, oder? dann wäre der rückgabetyp ja gleich richtig für die "weiterverarbeitung" im eigentlichen programm.
und die letzte, alles entscheidende frage: wenn es so unwahrscheinlich ist - wieso funktioniert dann alles?
-
wie waere es damit?
char *ftostr(float f, char *buff, size_t size) { if(buff == NULL) return NULL; snprintf(buff, size, "%f", f); return buff; }
-
dall schrieb:
daran, den zu befüllen string mit zu übergeben, hatte ich auch schon gedacht, aber das würde beim aufruf dann ja wieder mehr zeilen bedeuten, oder nicht?
ist aber sicherer und in der Regel thread-safe. Und was meinst du mit "mehr zeilen bedeuten?"
dall schrieb:
und wieso ist es glückssache, wenn ich ein lokales objekt zurückgebe? ich fange den rückgabewert doch dann ab, oder wie meintest du das?
und wieso ist es glückssache, wenn ich ein lokales objekt zurückgebe? ich fange den rückgabewert doch dann ab, oder wie meintest du das?
weil das ein undefiniertes Verhalten mit sich bringt
char *func() { char tmp[10]; ... return tmp; }
nachdem die Funktion verlassen wird, kann niemand garantieren, dass der Speicher unberührt bleibt. Er könnte gleich wieder von einer anderen Funktion beschrieben werden.
dall schrieb:
und die letzte, alles entscheidende frage: wenn es so unwahrscheinlich ist - wieso funktioniert dann alles?
siehe oben. Das ist nur ein Seiteneffekt, das heißt aber nicht, dass es immer funktionieren wird.
-
hallo supertux,
supertux schrieb:
wie waere es damit?
char *ftostr(float f, char *buff, size_t size) { if(buff == NULL) return NULL; snprintf(buff, size, "%f", f); return buff; }
das hab ich ausprobiert, allerdings gab es beim aufruf eine "speicherschutzverletzung".
supertux schrieb:
dall schrieb:
daran, den zu befüllen string mit zu übergeben, hatte ich auch schon gedacht, aber das würde beim aufruf dann ja wieder mehr zeilen bedeuten, oder nicht?
ist aber sicherer und in der Regel thread-safe. Und was meinst du mit "mehr zeilen bedeuten?"
ich wollte ja beim aufruf möglichst wenig zeilen haben. und wenn ich einen string in die funktion reinschicken soll, muss ich doch zwei schritte machen:
string MeinString;
Input->value(und so weiter);
wahrscheinlich ist es eigentlich pillepalle, ich wollte eben einfach nur auf das minimalste reduzieren. außerdem ging es in meinen kopf nicht rein, wieso das, was ich selbst probiert hatte, alles nicht funktionieren wollte. deswegen lass ich es jetzt mal gut sein und beschränke meine weiteren fragen nur auf das verständnis dieser folgenden sachesupertux schrieb:
dall schrieb:
und wieso ist es glückssache, wenn ich ein lokales objekt zurückgebe? ich fange den rückgabewert doch dann ab, oder wie meintest du das?
weil das ein undefiniertes Verhalten mit sich bringt
char *func() { char tmp[10]; ... return tmp; }
nachdem die Funktion verlassen wird, kann niemand garantieren, dass der Speicher unberührt bleibt. Er könnte gleich wieder von einer anderen Funktion beschrieben werden.
dall schrieb:
und die letzte, alles entscheidende frage: wenn es so unwahrscheinlich ist - wieso funktioniert dann alles?
siehe oben. Das ist nur ein Seiteneffekt, das heißt aber nicht, dass es immer funktionieren wird.
das ist doch aber nur so, wenn der rückgabewert ein zeiger ist, oder nicht? da muss ich mich aber gründlich vertan haben.. deswegen hatte ich ja bei dieser string-sache extra keinen pointer. in unserem vorlesungsskript steht zum beispiel folgendes:
// Funktionsimplementation (Definition) unsigned long fakultaet(int zahl) { unsigned long fak = 1; for(int i = 2; i <= zahl; ++i) fak *= i; return fak;
und als funktionsaufruf:
unsigned long Erg = fakultaet(n);
ist das jetzt professionellerweise auch nicht okay? dann find ich's schon sehr schockierend, dass uns das beigebracht wird.
vielen dank für eure antworten.
achja, muss ich noch sagen, dass ich mit linux arbeite? wo ich schon mal dabei bin, mein völliges unwissen darzubieten, könnte das eigentlich nicht schaden.
-
dall schrieb:
das ist doch aber nur so, wenn der rückgabewert ein zeiger ist, oder nicht?
Richtig!
-
zum glück!!
-
dall schrieb:
das ist doch aber nur so, wenn der rückgabewert ein zeiger ist, oder nicht? da muss ich mich aber gründlich vertan haben.. deswegen hatte ich ja bei dieser string-sache extra keinen pointer.
der zeiger wird schon richtig zurückgegeben, nur das worauf er zeigt, wenn es sich um ein (nichtstatisches) lokales objekt handelt, ist ungültig. was ist denn nun dieses 'string'? wenn kein zeiger, dann vielleicht eine 'struct'? das ginge natürlich auch, denn bei structs werden 'im hintergrund' alle members der quell- in die zielstruct kopiert.
-
Nun wie ich sehe, gibt es zwischen Fricky und dall ein kommunikationsproblem.
Es geht um den typ string.
Wir sind im ANSI C forum, was fricky wundert, ist das string kein std. typ von C ist.. wei da strings in char array gespeichert werden.
Ich nehme an das dall in c++ arbeitet, und sich da std::string zu nutzen macht, ohne zu wissen das er jetzt schon mit c++ statt C arbeitet, oder er wusst enich in welchel forum er seine frage (da anfänger) stellen soll.
Kurz:
Wenn dall std::string verwendet, kann die funktion so verwendet werden, da der String bei der rüggabe kopeirt wird.
Wenn es so wie fricky mein der string nur ein char* ist, dann wird nich der string, sonder die adressse auf dem der temporäte string in der funktion zurückgegben, welcher ja nach ende der funktion ungültig ist.
ALSO WAS IST STRING
-
hmm also ich hatte noch nie Probleme mit der Rückgabe von Strings...
Kann Zufall sein, muss aber nicht.
-
Hab jetzt nicht alle Antworten durchgelesen, aber falls die Idee noch nicht gekommen ist:
Warum nimmst du keinen char-pointer, versorgst ihn mittels malloc mit genügend Speicher, kopierst den String da rein, und gibst den char-pointer zurück ??
Dann darfst du aber auch nicht vergessen den Pointer, den du von der Funktion bekommst wieder mit free() freizugeben, sonst gibts ein Speicherleak.