Int zu char Array


  • Mod

    btw,

    SeppJ schrieb:

    Oder einfach casten und direkt auf dem Original arbeiten?

    int foo = 7;
    	reinterpret_cast<char*>(&foo)[0]=9;
    	cout << foo;
    

    keiner hier mag Referenzcasts?

    int foo = 42;
        auto& foo_as_chars = reinterpret_cast<char(&)[]>(foo);
    

    finde ich viel sprechender in Hinblick auf das, was im Anschluss damit gemacht wird.



  • camper schrieb:

    btw,

    SeppJ schrieb:

    Oder einfach casten und direkt auf dem Original arbeiten?

    int foo = 7;
    	reinterpret_cast<char*>(&foo)[0]=9;
    	cout << foo;
    

    keiner hier mag Referenzcasts?

    int foo = 42;
        auto& foo_as_chars = reinterpret_cast<char(&)[]>(foo);
    

    finde ich viel sprechender in Hinblick auf das, was im Anschluss damit gemacht wird.

    Seit wann gibts es denn Referenzen auf Arrays of unknown Bound? Kann man die ueberhaupt irgendwie gueltig initialisieren, mal abgesehen von Casts?


  • Mod

    Kellerautomat schrieb:

    Seit wann gibts es denn Referenzen auf Arrays of unknown Bound? Kann man die ueberhaupt irgendwie gueltig initialisieren, mal abgesehen von Casts?

    Schon immer. Genauso wie du z.B. Referenzen auf noch nicht definierte Klassen haben kannst.

    extern int array[];
    int (&ref)[] = array;
    int array[4]; // decltype(ref) ist immer noch int(&)[] - der referenzierte Typ wird also nicht nachträglich vollständig
    


  • Ich habe auch eine solche extern-Deklaration ohne Bounds noch nie gesehen. Hat das Ganze irgendeinen praktischen Nutzen?


  • Mod

    Kellerautomat schrieb:

    Ich habe auch eine solche extern-Deklaration ohne Bounds noch nie gesehen. Hat das Ganze irgendeinen praktischen Nutzen?

    Du kannst stehts ein array-to-pointer decay durchfüren und den Zeiger auf das erste Element erhalten. Damit kannst du auch direkt auf die Arrayelemente per Subscript-Operator zugreifen:

    extern int arr[];
    	arr[5] = 3;
    

    Gibt dir zwar ggf. einen Linker-, nicht aber einen Compilerfehler. Du kannst also (teilweise eingeschränkt) damit arbeiten.

    Das Ganze könnte vielleicht nützlich werden wenn du von ÜE A auf ein Array in ÜE B zugreifen willst, aber unabhängig von der genauen Größe bleiben willst. Einen konkreten Anwendungsfall kenne ich nicht.


  • Mod

    Kellerautomat schrieb:

    Ich habe auch eine solche extern-Deklaration ohne Bounds noch nie gesehen.

    Ich auch nicht.

    Kellerautomat schrieb:

    Hat das Ganze irgendeinen praktischen Nutzen?

    Vermutlich nicht. Die wenigen denkbaren Anwendungsfälle, die mir einfallen, kann man genauso gut auch anders lösen. Abgesehen von unique_ptr<foo[]> kommen solche Arrays wahrscheinlich nur sehr selten vor. Und selbst diesen Anwendungsfall hätte man recht problemlos anders lösen können, wenn es das Sprachfeature nicht gäbe.



  • Hallo Camper,

    das sog. "type punning" mittels Unions in C++ (11) wird aber von anderen aufgrund dieses Satzes als nicht konform angesehen (auch wenn im Standard nicht explizit von UB die Rede ist - aber es ist ja alles UB was eben nicht im Standard steht ;-):
    http://stackoverflow.com/questions/11373203/accessing-inactive-union-member-undefined
    http://stackoverflow.com/questions/2310483/purpose-of-unions-in-c-and-c
    http://stackoverflow.com/questions/6136010/is-using-an-union-in-place-of-a-cast-well-defined

    Und auch unter union vs reinterpret_cast wird es als UB beschrieben.

    Oder doch einfach nur ein Mythos?



  • Wenn ich mich da richtig erinnere sagt Bjarne Stroustrup in The C++ Programming Language sinngemäß, dass das Verwenden von Unions zur Typumwandlung obwohl weit verbreitet UB ist und außerdem überflüssig in eine Sprache, die echte Typumwandlungen unterstützt. Er meint, dass sich das eingebürgert habe, da es in manchen Sprachen keine andere Möglichkeit gab.


  • Mod

    Th69 schrieb:

    Hallo Camper,

    das sog. "type punning" mittels Unions in C++ (11) wird aber von anderen aufgrund dieses Satzes als nicht konform angesehen (auch wenn im Standard nicht explizit von UB die Rede ist - aber es ist ja alles UB was eben nicht im Standard steht ;-):
    http://stackoverflow.com/questions/11373203/accessing-inactive-union-member-undefined
    http://stackoverflow.com/questions/2310483/purpose-of-unions-in-c-and-c
    http://stackoverflow.com/questions/6136010/is-using-an-union-in-place-of-a-cast-well-defined

    Und auch unter union vs reinterpret_cast wird es als UB beschrieben.

    Oder doch einfach nur ein Mythos?

    Ich habe mich nur auf das konkrete Zitat bezogen, dass für sich genommen nicht ausreicht, um UB zu begründen. Zu der allgemeinen Problematik des type-punnings (mit oder ohne union) will ich damit nicht Stellung genommen haben. Der Fall char/unsigned char ist allerdings speziell und immer erlaubt.


  • Mod

    Arcoth schrieb:

    Ich würde daraufhin einwenden, dass es in jeder bekannten Implementierung wie gewünscht funktioniert

    GCC kann hier durchaus gruselige Optimierungen durchführen.

    Mein Punkt war: Eben nicht. Soweit ich weiß garantiert der GCC, dass das wie gewünscht funktioniert. Aber ich mag gerade nicht das GCC-Handbuch durchpflügen.


Anmelden zum Antworten