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?
-
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- direkt übergeben
- 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;
-
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
-
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.