Zeiger zu long umwandeln!



  • tuts nicht auch nen reinterpret_cast<long>(this)?



  • thordk schrieb:

    tuts nicht auch nen reinterpret_cast<long>(this)?

    Yuppie! Das funzt!
    Jetzt will ich wissen wie ich aus long, den Zeiger kriege! 😉



  • genauso.

    struct A
    {
      long ptr() {
        return reinterpret_cast<long>(this);
      }
    };
    
    int main() {
      A a;
      long l = a.ptr();
      A *b;
      b = reinterpret_cast<A*>(l);
    }
    

    aber bevor du das so verwendest, soll jemand mit mehr reinterpret_cast ahnung als ich sein OK geben ^^



  • Als Typ würde ich eher ptrdiff_t oder size_t empfehlen. Auf Systemen mit zB LLP64 Datenmodell (Win64) hast du mit long ein Problem.



  • Aber wofür willst du einen Zeiger in einer long-Variable speichern? Abgesehen davon, dass glaubich gar nicht gesichtert ist, dass der Zeiger auch reinpasst.



  • Badestrand schrieb:

    Aber wofür willst du einen Zeiger in einer long-Variable speichern?

    ZB um mehr Freiheit bei der Adressmodifizierung zu haben.



  • groovemaster schrieb:

    Badestrand schrieb:

    Aber wofür willst du einen Zeiger in einer long-Variable speichern?

    ZB um mehr Freiheit bei der Adressmodifizierung zu haben.

    Äh?

    So etwas macht man nicht!



  • Ich benutze gerade Win32 API. Dort kann man beim Erstellen eines Windows zusätzlich Speicherplatz reservieren. Ich habe 8 Bytes festgelegt. Darin kann man beliebige Daten speichern. Leider sind die get/set Funktionen mit long versehen. D.h., wenn ich einen Zeiger speichern/lesen will, muss ich immer diese hässliche Konvertierung machen! 😮



  • rüdiger schrieb:

    Äh?

    So etwas macht man nicht!

    Doch, macht man schon, sofern man es braucht. Einfach mal ein bisschen über simple Zeigerarithmetik hinaus denken. 😉



  • Zdravko schrieb:

    Ich benutze gerade Win32 API. Dort kann man beim Erstellen eines Windows zusätzlich Speicherplatz reservieren. Ich habe 8 Bytes festgelegt. Darin kann man beliebige Daten speichern. Leider sind die get/set Funktionen mit long versehen. D.h., wenn ich einen Zeiger speichern/lesen will, muss ich immer diese hässliche Konvertierung machen! 😮

    also wieder einer der grauenvollen designfehler von win32

    warum nicht einfach eine lib benutzen die das ganze weniger hirnverbrannt macht

    (winapi nutzen macht imho nur sinn, wen __explizit__ verlangt



  • Wo genau ist da ein Design Fehler?

    Edit:
    es handelt sich übrigens nicht um den C++ Datentyp long sondern um das typedef LONG_PTR dass garantiert die größe hat um einen Zeiger aufnehmen zu können 😉


Anmelden zum Antworten