funktion erstellen, die float in string umwandelt



  • 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 sache 🙂

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


Anmelden zum Antworten