CString-Problem



  • Hallo zusammen,

    ich habe ein Problem, wo ich momentan auf dem Schlauch stehe um die Lösung zu finden. Vielleicht kann mir ja jemand einen Tip geben.

    1.) Ich habe einen: CString test;
    2.) Reiche diesen in eine Funktion: GiveBack(char *giveback);
    die per strcpy den text kopiert strcpy(giveback, "text").

    3.)Der aufruf sieht wie folgt aus: GiveBack(test.GetBuffer(test.GetLength());
    4.)Naturlich folgt darauf ein: test.ReleaseBuffer(test.GetLength());

    und weg ist geholte der text

    war auch nicht anders zu erwarten, aber gibt es eine Möglichkeit den CString dauerhaft von außen zu setzen edit*?

    Vielen Dank,
    Gruß codeman

    edit: ohne das CString-Objekt in die Funktion hinein zu reichen.



  • 3.)Der aufruf sieht wie folgt aus: GiveBack(test.GetBuffer(test.GetLength());

    Das ist bei leerem test natürlich ein echter Geniestreich 😉



  • Du solltest bei GetBuffer() nicht die aktuelle Größe angeben, sondern das, was du als Eingabelänge erwartest - sonst überschreibst du in der Funktion Speicherbereiche, die dir nicht gehören (und das kann ins Auge gehen).



  • jencas schrieb:

    3.)Der aufruf sieht wie folgt aus:
    Das ist bei leerem test natürlich ein echter Geniestreich 😉

    Ja hast recht 😃 ist mir auch erst jetzt aufgefallen.

    Aber gibt es denn keine Lösung für das Problem.
    Sobald ich den buffer wieder release ist alles weg, aber zwischen dem getbuffer und dem releasebuffer kann man ja keine memberfunction von CString mehr aufrufen, um vielleicht den Inhalt von dem buffer noch notfalls um zu kopieren.
    Jegliches arbeiten mit dem buffer und einer CString memberfunction ist somit nicht möglich, aber den buffer kann man auch nicht in das eigentliche CString-Objekt übernehmen, soweit ich das verstanden habe.

    Ufff, da hab ich doch mal lieber den alten char-vector von C als alle möglichen angenehmen feinheiten von CString das nicht abwährtskompatiebel ist.



  • Nein, nach dem ReleaseBuffer() ist der String-Inhalt nicht weg - wenn doch, ist dein Compiler im Eimer.



  • Ich vermute mal, dass Du auf den Datentyp des Übergabeparameters an GiveBack() keinen Einfluss hast. Dann wirst Du den Umweg über einen char[] Buffer gehen müssen, dessen Inhalt Du nach dem GiveBack() Aufruf dann in test packen musst.



  • CStoll schrieb:

    Nein, nach dem ReleaseBuffer() ist der String-Inhalt nicht weg - wenn doch, ist dein Compiler im Eimer.

    Sorry, mein fehler 😞 ich hatte vergessen eine größe im GetBuffer anzugeben und den release auch mit dem GetLenght() aufgerufen, also:

    test.GetBuffer(test.GetLenght());  // Genialitätsmoment
    test.ReleaseBuffer(test.GetLenght()); // Lesen bringt doch was :)
    

    damit war der Inhalt kurzzeitig da und dann natürlich alles wider weg. Kann nicht gehen. Naja, morgenstund und so weiter...

    So funzt es:

    test.GetBuffer(minlength);
    test.ReleaseBuffer();
    

    Danke noch mal an euch 🙂


  • Mod

    codeman schrieb:

    test.GetBuffer(test.GetLenght());  // Genialitätsmoment
    test.ReleaseBuffer(test.GetLenght()); // Lesen bringt doch was :)
    

    1. Statt test.GetBuffer(test.GetLength()); kann man immer test.GetBuffer(0) schreiben. In diesem Fall wird der aktuelle Speicher retruniert.
    2. test.ReleaseBuffer(test.GetLenght()); ist überflüssig und irreführend (ich würde soweit gehen und falsch sagen)! GetLength ist nach einem GetBuffer theoretisch undefiniert. Entweder überlässt man CString die Sacheund ruft nur test.ReleaseBuffer() auf, oder man weiß was man getan hat und setzt den richtigen wert.


Anmelden zum Antworten