String nach unsigned char*



  • Hi,

    nachdem ich gestern ja schon gefragt habe, wie man unsigned char* nach float konvertieren kann, habe ich heute schon wieder ein sehr ähnliches Problem.

    Heute habe ich auch schon in der FAQ nachgeschaut und die Hilfe bemüht, aber ich habe nix gefunden.

    Wie dem auch sei, in dem Framework, welches ich verwende, will ich einen String, der zuvor aus Zahlen aufgebaut wurde (per ostringstream) zu einem unsigned char* konvertieren.

    Jetzt sieht mein Code wie folgt aus:

    unsigned char buf[512];
    float value, value_old = 0.0f;
    bool initialized = false;
    char* c_str = "";
    unsigned int str_length = 0;
    ostringstream ostr;
    ...
    if (initialized && value_old * value <= 0) {
    	ostr << value_old << " " << value << endl;
    	c_str = (char *)ostr.str().c_str();
    	str_length = ostr.str().size();
    	memcpy(buf, c_str, str_length);
    
    	...
    }
    

    Wenn ich den Code jetzt mehrmals (in einer while Schliefe) mit verschiedenen values (values_old) aufrufe, dann erhalte ich aber leider immer den selben Inhalt in buf. Irgendwann bricht das Framework auch mit einem Segmentation fault ab.

    Kann mir wer sagen was hier falsch ist und vor allem: wieso?

    Danke,
    Niko



  • du castest c_str nach char*, dass du das tun "musst" schließt auf misbrauch von den Daten.
    Es wird nicht umsonst ein _const_ char* zurückgegeben.



  • Hi,

    naja... den Teil hab ich per Copy&Paste von einer anderen Klasse im Framework!
    Ist zwar nicht optimal, aber ich denke nicht, dass das was mit dem eigentlichen Problem zu tun hat.

    MfG,
    Niko



  • Hi,

    nachdem ich jetzt mal eine kleine Pause gemacht hab, kann ich auch wieder denken 😉
    Kurz gesagt: Das Problem ist gelöst!
    Der Fehler lag darin, dass ostr immer größer wurde...
    ...wenn man den stringstream leer, dann funktioniert es!

    Hier der funktionierende Code:

    unsigned char buf[512];
    float value, value_old = 0.0f;
    bool initialized = false;
    char* c_str = "";
    unsigned int str_length = 0;
    ostringstream ostr;
    
    ...
    
    if (initialized && value_old * value <= 0) {
        // String leeren
        ostr.str("");
        ostr << value_old << " " << value << endl;
        c_str = (char *)ostr.str().c_str();
        str_length = ostr.str().size();
        memcpy(buf, c_str, str_length);
    
        ...
    }
    


  • Eine Frage solltest Du Dir noch stellen:
    Ist der buf hinterher nullterminiert, wenn vorher zufälliger Inhalt dringestanden hätte? 😉



  • Hi,

    ich habe noch keine genaue Doukmentation zu ostr.str().c_str() gefunden, aber liefert mir die Funktion den String nicht schon nullterminiert (analog die Size Funktion... beinhaltet auch schon die \0, oder?)?

    Ich steh grad auf der Leitung, sorry!
    Was soll da noch ein Problem sein?

    Kann mir evtl. jemand mal einen Link zu ner Page geben, auf der die ganzen Funktionen besser erklärt sind als per "man" Befehl oder in meinem kleinen C/C++ gepackt Buch?

    Niko



  • std::string::c_str() liefert zwar einen nullterminierten C-String zurück, aber std::string::size() liefert die echte Länge des Textes zurück. Es garantiert auch niemand, dass die Sequenz innerhalb std::string "am Stück" oder nullterminiert gespeichert werden muss, es wird nur garantiert, dass std::string::c_str() einen Zeiger auf einen nullterminierten, am Stück abgelegten Speicherbereich zurückgibt, der diesen Text enthält und solange gültig ist, wie Du den std::string nicht veränderst oder zerstörst.

    Nachzulesen z.B. auf http://www.dinkumware.com/manuals/?manual=compleat&page=string2.html#basic_string::c_str
    (Vorsicht, die Referenz ist ziemlich "wissenschaftlich" 😉 )

    EDIT:
    Warum nimmst Du nicht str(n)cpy, der kopiert das Nullbyte "naturgemäß" mit...



  • Hi,

    okay, das war schon mal sehr hilfreich 😉
    Muss in C++ wohl noch einiges lernen!

    Danke,
    Niko



  • Hallo,

    also ich habe das Problem mit der Nulltermination durch ein

    buf[str_length] = '\0'
    

    gelöst.

    Aber wie ich da strcpy verwenden kann, weis ich leider nicht. Das Problem ist, dass strcpy ein char* und ein const char* erwartet. Ich arbeite aber mit dem unsigned char*. Kann ich das irgednwie einfach umwandeln?

    Ich muss wirklich sagen, dass mich es ein wenig "nervt", dass hier unsigned verwendet wurde. Damit komme ich noch nicht wirklich "gut" klar.

    MfG,
    Niko


Log in to reply