UINT to void*

Thomasio

Erfahrenes Mitglied
Soweit ich weiss ist es nicht ganz die saubere Art, aber gängige Praxis, dass man in CreateThread() eine Variable zu void* castet, z.B. einen SOCKET.

Code:
SOCKET Socket = socket(AF_INET,SOCK_STREAM,0);

...

DWORD nThreadID;
CreateThread(0,0,UserThread,(void*)Socket,0,&nThreadID);


DWORD WINAPI UserThread(void* Data)
{

SOCKET Socket = (SOCKET)Data;

...

return 0;

}

Das funktioniert ja auch prima, auch in 64bit, solange es ein SOCKET ist, weil in allen Systemen void* und SOCKET die gleiche Bitbreite hat.
In 32bit Programmen kann ich auf dieselbe Art auch ein int im void* verstecken.

Problem ist nur, wenn in einem 64bit Programm die Variable ein int sein soll, weil hier void* 64bit hat, ein int aber nur 32bit.
Logisch meckert der Compiler dann:
"cast to pointer from integer of different size"

Wie mache ich aus dem int ein 64bit int, oder wie sonst übergebe ich dem Thread meine Variable?
 
Hi.

Du kannst den Typ ptrdiff_t verwenden. Dieser ist auf 32bit Plattformen 32bit, auf 64bit Plattformen 64bit groß.

\edit: Oder für unsigned int besser size_t.
C:
#define UINT_TO_POINTER(u) ((void*)(size_t)u)
#define POINTER_TO_UINT(p) ((UINT)(size_t)p)
 

Neue Beiträge

Zurück