cannot convert from 'const char *' to 'char *'



  • *Hans Wurst schrieb:

    ich habe vor, nach dem gebastel das ergebnis als 'const char *' an eine vordefinierte funktion zu übergeben, die leider eben nur 'const char *' annimmt.

    Wenn die Funktion sowieso const char*'s nimmt, wozu verwendest du dann einen (nicht-const) char*?



  • an CStoll:

    ja, gute frage. ich habe darum gleich nochmals überprüft, was für ein typ die funktion (static_value) nun haben will und bin mir da jetzt gar nicht mehr sicher. hier ist erstmal der code. was mich verwundert ist die tatsache, dass die funktion sowohl mit name (const char 😉 als auch mit buf (char 😉 funktioniert. wie kann ich das verstehen?

    public:
    	cInWin (int w, int h, const char *name = 0) : Fl_Window (w,h,name)
    	{
    		char *buf = "TEST";
    		Fl_Input *o = new Fl_Input(10,10,w-20,h-70);
    		o->static_value(name);
    		o->static_value(buf);
    		show();
    	}
    

    vielen dank.
    H.W.



  • Dann gubk dir mal an, was in der Deklaration der Funktion steht (ich tippe auf const char*).

    Allgemein: Die Verwendung eines char* als const char* macht keine Probleme, schwierig wird es nur in der anderen Richtung (das Ergebnis hast du ja gesehen). Schließlich bedeutet nicht-const "ich darf den Wert ändern" und const "ich darf den Wert NICHT ändern" - und wenn ich einen variablen Wert erhalte und ihn nicht ändern will, ist das kein Problem 😉



  • Dann wird die Funktion wohl ein 'const char *' als Parameter haben, denn du kannst dann auch einen (nicht konstanten) char-Zeiger übergeben, nur in die andere Richtung ginge es nicht, d.h. einer Funktion, die 'char *' verlangt, der kannst du kein 'const char *' übergeben, da die Funktion ja die Inhalte des Strings verändern könnte.

    (Leider sind viele alte APIs noch mit einfachen 'char *' deklariert, obwohl die entsprechenden Funktionen den Inhalt des übergebenen Strings nicht ändern).



  • okay.

    dann ist es ein const char*. aber warum zeigt mir nun folgender code nicht das richtige ergebnis an? (es wird nämlich gar nichts angezeigt)

    const char *buf;
    		stringstream text;
    		text << "test";
    		buf = text.str().c_str();
    		Fl_Input *o = new Fl_Input(10,10,w-20,h-70);
    		o->static_value(buf);
    

    vielen dank!
    H.W.

    P.S.: ein beschreibung zu funktion gibts hier:
    http://embedded.centurysoftware.com/docs/nx/fltk-flinput.html#FLTK.FLINPUT.STATICVALUE



  • Möglicherweise bist du ja hierüber gestolpert:

    The string is not copied. [...] but this will only work if the passed string remains unchanged until either the Fl_Input is destroyed or value() is called again.

    (am Ende deiner Funktion wird text freigegeben und seine Daten wieder gelöscht)

    Als Lösung könntest du stattdessen das "normale" value() verwenden.



  • ich bin's schon wieder, denn

    o->value(buf);
    

    funktioniert auch nicht. das feld bleibt leer.

    H.W.



  • Nimm dir mal einen Debugger und schau dir an, was auf dem Weg eigentlich passiert.



  • ich habe deinen ratschlage gleichmal umgesetzt

    const char *buf;
    		stringstream text;
    		text << "test";
    		buf = text.str().c_str();
    

    am ende dieses schrittes, also nach der letzten zeile, ist buf immer noch leer. liegt das an der 'const' definition?

    DANKE!
    H.W.



  • Nein, eigentlich nicht - das "const" bedeutet nur, daß du über den Zeiger nicht deine String-Daten ändern darfst.

    Hmm, hast du mal versucht, text.str().c_str() direkt weiterzuverarbeiten?

    PS: Was ist eigentlich der Sinn darin, den Text "test" erstmal durch einen Stringstream zu jagen?



  • mit der weiterverarbeitung von text.str().c_str() klappt es. ich hatte dies vorher mit o->static_value() erfolglos versucht.

    den stringstream brauche ich, um mir vorher zusammenbasteln, was ich dann an die funktion übergebe.

    vielen dank für die schnelle hilfe!!!
    H.W.



  • Hans Wurst schrieb:

    mit der weiterverarbeitung von text.str().c_str() klappt es. ich hatte dies vorher mit o->static_value() erfolglos versucht.

    Na dann solltest du buf ganz entsorgen 😉

    So langsam wird mir auch klar, wo dein Fehler lag: stringstream::str() liefert eine Kopie der internen Daten. Das heißt, du hast dort eine temporäre Variable, die am Ende ihrer Anweisung wieder ins Nirvana geschickt wird. Als Lösung bleibt dir demzufolge nur, die Variable direkt weiterzugeben (nicht an static_value() - da löschst du dir auch die Daten unter dem hintern weg) oder in einen eigenen std::string zu kopieren.

    den stringstream brauche ich, um mir vorher zusammenbasteln, was ich dann an die funktion übergebe.

    OK, das ist ein Argument.


Anmelden zum Antworten