Adresse in Ulong Speichern



  • Hallo.

    Habe eine Funktion der ich eine Callback übergebe. In dieser Callback sollte ich jetzt auf persistente Daten zugreifen. Die Callback ist aber so definiert dass ich ihr nur einen Unsigned Long übergeben kann.

    Ist es möglich im dem ULong nun eine Adresse mitzugeben. Die Adresse von einem boolschen Wert?


  • Mod

    Auf einem 32bit System kannst Du einen Zeiger casten und in einen ULONG umwandeln.

    LPCTSTR pszTest = _T("Test");
    ULONG ulptr = reinterpret_cast<ULONG>(pszTest);
    


  • Danke für deine Antwort. Brauche aber einen Zeiger auf einen boolschen Wert.
    Habe das wie folgt gelöst:

    bool *flag = new bool(false);
    ULONG ulptr = (ULONG)flag;
    

    ulptr übergeben und zu gegebener Zeit löschen

    if(flag != NULL)
      delete flag;
    

    Funktioniert. Nur die Frage ist das so "sauber" oder gibt es ne bessere Lösung.



  • Bevor meine Frage in Vergessenheit geriet. Ist das nun so richtig?



  • Hallo

    Keiner mehr einen Tipp. Will doch nur wissen ob das so richtig ist



  • Du musst nicht zwingend die Variable mit new erzeugen.
    Du kannst den Wert

    1. direkt übergeben
    2. oder die Adresse einer Variablen auf dem Stack übergeben.
      Dadurch entfällt der Aufwand den Speicher freizugeben. 1) ist für einfache Datentypen gut; sofern du den Wert im Callback nicht "nach aussen sichtbar" verändern willst.

    Hat man die Wahl sollte man es nicht so machen (man weiss ja nicht, ob die Adresse in die Variable passt und in Zukunft auch noch passen wird). Da du aber keine andere Möglichkeit hast, musst du damit leben.



  • 1. direkt übergeben geht nicht, da ich den Wert verändern muss in der Callback
    2. Und wie übergebe ich die Adresse
    habe es wie folgt gemacht, dann aber einen Fehler erhalten:

    bool flag = false;
    ULONG ulptr = (ULONG)&flag;


  • Mod

    visualer schrieb:

    1. direkt übergeben geht nicht, da ich den Wert verändern muss in der Callback
    2. Und wie übergebe ich die Adresse
    habe es wie folgt gemacht, dann aber einen Fehler erhalten:

    bool flag = false;
    ULONG ulptr = (ULONG)&flag;

    Was für einen Fehler? Der Code ist OK!



  • Was für einen Fehler? Der Code ist OK!

    Oh habe noch was vergessen.

    Und zwar übergebe ich ja den Wert in die Callback
    in der Callback habe ich ja dann nun den ULONG Wert in der die Adresse steht zur Verfügung.

    Nun wollte ich dereferenzieren: bool flag = (bool)*ulptr;
    und hier liegt mein Fehler. Irgendwie weiß ich die genaue Syntax nicht. Genauso weiß ich nicht wie ich den Wert von "flag" nachdem ich ihn geändert habe wieder an die Adresse von ulptr zurückschreibe



  • Mich bitte nicht vergessen. Ist dringend 🙂


  • Mod

    visualer schrieb:

    Nun wollte ich dereferenzieren: bool flag = (bool)*ulptr;

    Wir wäre es wenn Du nochmal ein paar Grundlagen C++ lernen würdest?

    bool flag = *(bool*)ulptr;
    

    Besser

    bool flag = *reinterpret_cast<bool*>(ulptr);
    


  • @visualer:
    Falls du den Funktionstyp der Callback-Funktion noch ändern kannst, dann solltest du aus dem ULONG einen ULONG_PTR machen, oder gleich einen void*.

    Wenn du Callback-Funktionen dieses Typs meist einsetzt, wo du einfach nur einen Integer brauchst, dann ULONG_PTR.

    Wenn du meist sowieso irgendwas mit Zeigern rumcasten musst, dann void*.



  • Wir wäre es wenn Du nochmal ein paar Grundlagen C++ lernen würdest?

    Oja stimmt der schlaue Herr Richter. Bin nur gerade auf dem schlauch gestanden. Kann ja mal passieren.

    @hustbaer: Kann leider nichts an der Callback ändern erhalte ich aus einer fremden Lib. Mir wäre es auch recht gewesen einen void Pointer zu haben. Dann hätte ich hier erst gar nicht gefragt.



  • Habe übrigens auch schon selber gemerkt.


Log in to reply