notwendige Konvertierung von char* und const char*



  • Hallo,

    ich habe ein kleines Problem bei der Verwendung von char* bzw. const char*.
    Mein Gnu-Compiler wirft einen Fehler, sobald ich einen char* einen const char*
    zuweise. Die c-übliche Konvertierung (char*) will ich nicht verwenden, static_cast<char*>(const char*) geht an dieser Stelle nicht.
    Die oben genannte Konstellation ist so vorgegeben, dh. der const char* - wert ist ein funktionsparameter und char* ein strukturwert, der im laufe des programms änderbar sein muss.
    memcpy(...) an dieser Stelle könnte fehlschlagen, da der char* - Wert NULL sein kann. Ein Abprüfen auf NULL ist m. E. ziemlich unelegant.

    vielen Dank für eure Hilfe :xmas1:



  • Meines Erachtens liegt hier ein Designfehler vor. Wenn du einen const char* hast, ist das ein Zeiger auf Speicher, der nicht geändert werden soll. Du kannst zwar das const per const_cast wegcasten, allerdings ist das unschön und gegen die Erwartungshaltung des Anwenders. Zudem könnte sich dahinter ein Stringliteral befinden - Schreibzugriff auf Stringliterale führt zu undefiniertem Verhalten.

    Wieso soll die Variable überhaupt änderbar sein? Oder geht es nur darum, einen String ( const char* ) in den internen String ( char* ) zu kopieren, und dann den internen zu manipulieren? Falls ja, kannst du dafür std::copy() verwenden (nicht vergessen, vorher Speicher anzufordern und am Schluss wieder freizugeben).

    Aber das einfachste wäre sowieso der Datentyp std::string , was aber bei dir möglicherweise wegen des vorgegebenen Kontexts nicht geht.



  • um das prüfen auf 0 wirst du nicht drum rum kommen... es sei denn, du erklärst genauer, was du machst und wofür du den char* / const char* brauchst

    if (!const_char_ptr)
       return;
    
    std::string tmp = const_char_ptr;
    //ggf tmp.reserve(andere_laenge)
    
    //mit tmp arbeiten
    

    bb



  • Vielen Dank für Eure Antworten.
    Der Hintergrund ist ein Zugriff auf eine in C geschriebene API.
    Diese API hat zum einem vordefinierte Zugriffsfunktionen, die oftmals einen
    const char* als Parameter wollen. Die Werte dafür sind in genannter API als #define - Konstanten abgelegt.
    Zum anderen greifen eben diese Funktionen auf interne Datenstrukturen zu, die wiederum char* - Werte erwarten.
    Daran kann ich nichts ändern.

    Ich werde, wenn es keine anderen Ideen in diese Richtung gibt, memcpy(...) verwenden, muss natürlich die Strukturvariable vorher auf NULL prüfen,
    um einen Crash bei memcpy(...) zu vermeiden.
    Damit vermeidet man wenigstens dieses blöde Casting mittels (char*).

    Etwas besseres fällt mir nicht ein.

    Ich wäre für eine Lsg., die mehr C++ ist sehr dankbar. :xmas1:



  • Worin besteht denn nun genau den Teil, bei dem du Einfluss hast, beziehungsweise wo du etwas selbst schreiben musst?

    Und nochmals: Geht es dir nur um den Wert eines Strings? Also könntest du diesen kopieren? Oder musst du direkt den const char* abändern (was ich fraglich fände)?



  • Die zu füllende Struktur repräsentiert einen Menü-Item, d.h. mittels eines Arrays dieser Struktur (so die bisherige C - Umsetzung) hat man ein Menü definiert. Da ich aber eine C++ - Lsg. will, möchte ich das Menü als Vektor implementieren. Somit brauche ich aber auch genau diese Struktur als einzelnen Menüitem.
    Um diese Struktur aber als Menüitem in einem Vektor verwenden zu können, muss diese Struktur einen Konstruktor besitzen, was logischerweise in C nicht geht.
    Als habe ich sozusagen diese Struktur "gewrappt" und in einen eigenen Strukturtyp gepackt, der darüberhinaus noch einen Konstruktor besitzt, der die betreffende Struktur (und somit einen Menüitem) bei dessen Erzeugung initialisiert.
    Und da für die Initialisierung zwingend konstante Werte für Beschriftungen, Infotexte usw. vorgeschrieben sind, habe ich das angesprochene Problem.

    Die Texte selbst müssen während des Programmlaufs aber manipulierbar sein. :xmas1:



  • Du weichst meiner Frage aus. 😉

    Der interne char* - soll der dem übergebenen const char* zugewiesen werden (dass es sich um den gleichen Speicherbereich handelt)? Oder soll er kopiert werden, sodass der interne String eine eigene Speicherverwaltung besitzt und anschliessend vom übergebenen String unabhängig ist?

    Wäre auch gut, wenn du die relevanten Codestellen (Schnittstelle, interne Repräsentierung, Wrapper) kurz aufzeigen könntest. Natürlich nur, wenn diese nicht streng geheim sind. 😉



  • t.schubert schrieb:

    Die zu füllende Struktur repräsentiert einen Menü-Item, d.h. mittels eines Arrays dieser Struktur (so die bisherige C - Umsetzung) hat man ein Menü definiert. Da ich aber eine C++ - Lsg. will, möchte ich das Menü als Vektor implementieren. Somit brauche ich aber auch genau diese Struktur als einzelnen Menüitem.
    Um diese Struktur aber als Menüitem in einem Vektor verwenden zu können, muss diese Struktur einen Konstruktor besitzen, was logischerweise in C nicht geht.
    Als habe ich sozusagen diese Struktur "gewrappt" und in einen eigenen Strukturtyp gepackt, der darüberhinaus noch einen Konstruktor besitzt, der die betreffende Struktur (und somit einen Menüitem) bei dessen Erzeugung initialisiert.
    Und da für die Initialisierung zwingend konstante Werte für Beschriftungen, Infotexte usw. vorgeschrieben sind, habe ich das angesprochene Problem.

    Die Texte selbst müssen während des Programmlaufs aber manipulierbar sein. :xmas1:

    Hört sich für mich danach an, also ob du nicht wüstest was du machst oder die API schrott ist (welche ist es denn?). Wenn man den Text für einen Menüeintrag ändern will gibt es normal Methoden um die zu setzen/änderen und man ändert nicht den vorher irgendwas gesetzten string direkt oder solchen Quatsch.



  • wie sollst du ein char* übergeben, wenn du nicht weist, wie lang der menü-eintrags-name ist? ansonsten solltest du evtl auch mal nexus' frage(n) beantworten damit man dir helfen könnte ^^

    bb


Anmelden zum Antworten