const char* in char* umwandeln



  • Kann ich folgende Umwandlung

    std::string CommandTriggerContinous;
    CommandTriggerContinous = "init";
    
    char * buffer = const_cast<char*>(CommandTriggerContinous.c_str());
    
    GPIB_Out(buffer);
    

    gefahrenlos durchführen wenn ich nicht weiß ob 'buffer' später noch geändert wird?

    Konkret übergebe ich 'buffer' an eine Klasse zur Geräteansteuerung und weiß nicht was damit passiert.

    Matthias



  • Nein.
    Mach eine Kopie und übergib diese.



  • simon.gysi schrieb:

    Nein.
    Mach eine Kopie und übergib diese.

    Wie mache ich denn eine Kopie? Das wollte ich ja gerade mit obigem Code erreichen.



  • pospiech schrieb:

    Kann ich folgende Umwandlung...gefahrenlos durchführen wenn ich nicht weiß ob 'buffer' später noch geändert wird?

    Nein. Dann solltest du lieber den Inhalt des Strings in ein separates char[] umkopieren. const_cast sollte nur verwendet werden wenn definitiv keine Datenänderung durchgeführt wird.

    cu André



  • asc schrieb:

    pospiech schrieb:

    Kann ich folgende Umwandlung...gefahrenlos durchführen wenn ich nicht weiß ob 'buffer' später noch geändert wird?

    Nein. Dann solltest du lieber den Inhalt des Strings in ein separates char[] umkopieren.

    Wie soll das dann gehen?

    folgendes ist nämlich nicht möglich

    char [] buffer = CommandTriggerContinous.c_str();
    


  • Entweder in einer Schleife oder strcpy oder memcpy.
    Oder std::copy verwenden.



  • simon.gysi schrieb:

    Entweder in einer Schleife oder strcpy oder memcpy.
    Oder std::copy verwenden.

    strcpy geht nicht:

    char buffer[100];
    	strcpy(buffer,CommandTriggerContinous.c_str());
    	GPIB_Out(&buffer);
    

    Konvertierung des Parameters 1 von 'char (*)[100]' in 'char *' nicht möglich

    Da es sich hier ja eigentlich um ein übliches Problem handelt müsste es doch auch eine grundsätzlich funktionierende Lösung geben? Mir wäre sehr geholfe, wenn jemand dazu ein Code Beispiel posten könnte.



  • char* buffer = new char[CommandTriggerContinous.size()+1];
    strcpy(buffer,CommandTriggerContinous.c_str());
    GPIB_Out(&buffer);
    delete[] buffer;
    


  • pospiech schrieb:

    simon.gysi schrieb:

    Nein.
    Mach eine Kopie und übergib diese.

    Wie mache ich denn eine Kopie? Das wollte ich ja gerade mit obigem Code erreichen.

    Nunja, dass const_cast einen cast durchführt und keine Kopie, ist nicht soooo schwer zu erraten. 😉

    pospiech schrieb:

    ....
    strcpy geht nicht:

    char buffer[100];
    	strcpy(buffer,CommandTriggerContinous.c_str());
    	GPIB_Out(&buffer);
    

    Konvertierung des Parameters 1 von 'char (*)[100]' in 'char *' nicht möglich

    ....

    doch das "geht" ... aber Du solltest Dir angewöhnen, auf die Zeilenangaben bei den Fehlermeldungen zu achten, denn dass

    pospiech schrieb:

    ....

    GPIB_Out( &  buffer); // <- "&" hat da nichts zu suchen
    

    nicht geht, ist relativ klar (und genau das, was der Compiler anmeckern dürfte).

    Übrigens: NIEMALS !!! ungeprüfte Längen bei str_/_printf//...-Funktionen verwenden !!

    Gruß,

    Simon2.



  • std::string s = "test";
    
    char buf1[10] = { '\0' };
    strcpy(buf1, s.c_str());
    
    char buf2[10] = { '\0' };
    memcpy(buf2, s.data(), s.size());
    
    char buf3[10] = { '\0' };
    size_t len = s.copy(buf3, s.size());
    
    char buf4[10] = { '\0' };
    std::copy(s.begin(), s.end(), buf4);
    

    @pospiech:
    Die Variante mit strncpy kannst du dir ja selbst schreiben.



  • brrr, immer diese char-arrays.
    so geht's auch:

    std::string x = "init";
    
    vector<char> buffer(x.begin(), x.end());
    
    GPIB_Out(&buffer[0]);
    

    und du musst dich nirgends selbst ums aufräumen kümmern.


Log in to reply