const wert verändern.



  • Hallo,

    const char *name_;

    Ich muss den Inhalt dieses pointers verändern..
    Ich weiß, das const hier hat seinen Grund, und wenn ich den Inhalt verändern muss ist dies bereits ein Fehler im Design.
    Das Programm ist nur nicht von mir, und ich MUSS den Inhalt einfach verändern. Die Möglichkeit die Variable einfach nicht mehr const zu machen ist hier zu aufwendig da das Programm relativ groß ist und diese durch zig Methoden benutzt wird.

    Wenn es einen hack / trick gibt wie ich zu meinem ziel komme. BITTE helft mir *g*
    falls es mit einem cast möglich ist, müsste ich einen c cast verwenden.

    danke... lg



  • const char* ConstPtr= "Test123";
    char* NonConstPtr= (char*)(ConstPtr);
    


  • Du kannst das const schon wegcasten.
    Nur ist das was dann passiert, also das schreiben in den Speicher, soweit ich weiß undefiniertes Verhalten.



  • Paul Manns schrieb:

    Du kannst das const schon wegcasten.
    Nur ist das was dann passiert, also das schreiben in den Speicher, soweit ich weiß undefiniertes Verhalten.

    Also bei mir bringt das kein undefiniertes Verhalten 😮



  • Blaze schrieb:

    Also bei mir bringt das kein undefiniertes Verhalten 😮

    Dann hattest du vielleicht einfach nur viel Glück.



  • Blaze schrieb:

    Also bei mir bringt das kein undefiniertes Verhalten 😮

    Undefiniert heißt ja: es kann alles passieren.

    (evtl. sogar das, was man eigentlich erreichen wollte ;))



  • dooooomi schrieb:

    Blaze schrieb:

    Also bei mir bringt das kein undefiniertes Verhalten 😮

    Undefiniert heißt ja: es kann alles passieren.

    (evtl. sogar das, was man eigentlich erreichen wollte ;))

    Nein..undefiniert bedeutet dass etwas passiert das man nicht voraussagen kann.
    Aber nicht das ALLES passieren kann.



  • Paul Manns schrieb:

    Du kannst das const schon wegcasten.
    Nur ist das was dann passiert, also das schreiben in den Speicher, soweit ich weiß undefiniertes Verhalten.

    Vor allem ist das Schreiben in Zeichenkettenliterale - also alles, was im Code mit Anführungszeichen deklariert wird, undefiniert.



  • also no way wenn ich Garantie brauche das es klappt ?



  • sust schrieb:

    also no way wenn ich Garantie brauche das es klappt ?

    Wenn der const char* möglicherweise auf Zeichenkettenliterale zeigt, nein.



  • sust schrieb:

    also no way wenn ich Garantie brauche das es klappt ?

    Mußt du zwangsläufig den Speicher verändern, auf den der Pointer zeigt? Denn nur der ist ja konstant, den Pointer selbst kannst du "umbiegen" und auf etwas anderes zeigen lassen.

    Außerdem verstehe ich nicht ganz was dagegen spricht, das "const" einfach rauszunehmen. Alles was du mit einer Konstanten machen kannst, geht ja mit einer Variablen genauso gut. Von daher solltest du doch an den Funktionen nichts ändern müssen.



  • sust schrieb:

    Die Möglichkeit die Variable einfach nicht mehr const zu machen ist hier zu aufwendig da das Programm relativ groß ist und diese durch zig Methoden benutzt wird.

    wenn du den quelltext hast, dann tu das trotzdem. alles andere ist übles gefrickel, das dir jederzeit um die ohren fliegen kann.
    und wenn du schon mal dabei bist, könntest du den code ja auch gleich in die neuzeit hieven und die neuartigen erfindungen kapselung und std::string einsetzen.



  • schade,
    ich dacht ja immer in c++ lässt sich alles irgendwie machen *g*

    danke trotzdem für eure schnelle hilfe



  • dooooomi schrieb:

    Außerdem verstehe ich nicht ganz was dagegen spricht, das "const" einfach rauszunehmen.

    Siehe meine letzten beiden Posts.

    sust schrieb:

    ich dacht ja immer in c++ lässt sich alles irgendwie machen *g*

    Irgendwie schon. Zu den schwierigeren Dingen gehört halt unter anderem, Gefrickel wieder umgänglich zu machen.



  • sust schrieb:

    schade,
    ich dacht ja immer in c++ lässt sich alles irgendwie machen *g*...

    Es lässt sich ja auch machen ... wie z.B. oben schon gezeigt (warum hat eigentlich niemand const_cast vorgeschlagen?) - auch "Ferkeleien".
    Dass solche möglich sind, bedeutet aber auch unter der Verwendung von C++ nicht, dass sie keine seien.... 😃

    Gruß,

    Simon2.



  • dooooomi schrieb:

    sust schrieb:

    also no way wenn ich Garantie brauche das es klappt ?

    Mußt du zwangsläufig den Speicher verändern, auf den der Pointer zeigt? Denn nur der ist ja konstant, den Pointer selbst kannst du "umbiegen" und auf etwas anderes zeigen lassen.

    Außerdem verstehe ich nicht ganz was dagegen spricht, das "const" einfach rauszunehmen.

    Im notfall könnte ich in dem fall natürlich auch eine neue Variable anlegen und den Pointer auf diese umbiegen.. mal schaun

    Die Variable wird zb im constr. gesetzt. Dieser wird unzählige male aufgerufen und dabei der name als const mitgegeben. Weitere unzählige male werden diese namen irgendwo erst mit const definiert.

    blärk! schrieb:

    wenn du den quelltext hast, dann tu das trotzdem. alles andere ist übles gefrickel, das dir jederzeit um die ohren fliegen kann.
    und wenn du schon mal dabei bist, könntest du den code ja auch gleich in die neuzeit hieven und die neuartigen erfindungen kapselung und std::string einsetzen.

    *g* ja, ich weiß, ich will eigentlich nix mehr mit c zu tun haben. Mich nervts das ich kaum container verwednen kann, und strings fehlen mir sowieso : (

    leider ist das ganze ein eher unausgereiftes betriebsystem und somit ziemlich umfangreich. Habe leider nicht die Zeit dieses in die "neuzeit" zu hieven *g*



  • Nexus schrieb:

    dooooomi schrieb:

    Außerdem verstehe ich nicht ganz was dagegen spricht, das "const" einfach rauszunehmen.

    Siehe meine letzten beiden Posts.

    Was ich meine ist das const in der Variablendeklaration. Das ist der einzig saubere Weg, und dürfte auch keinen großen Aufwand nach sich ziehen.



  • dooooomi schrieb:

    Das ist der einzig saubere Weg, und dürfte auch keinen großen Aufwand nach sich ziehen.

    Das ist schwierig abzuschätzen, wenn man den Code nicht kennt. Gut möglich, dass es an sehr vielen Stellen geändert werden müsste.

    Abgesehen davon ist ein char* auf ein Stringliteral nicht sicherer als ein const char* , eher im Gegenteil.


Log in to reply