Re: Frage zu DWORD
- From: Ulrich Eckhardt <eckhardt@xxxxxxxxxxxxxx>
- Date: Thu, 16 Mar 2006 16:58:32 +0100
Matthias Meier wrote:
ich würde gerne zu einem item in einem CListCtrl einen Pointer auf ein
Objekt und noch ein zusätzliches Flag setzen. Ist es möglich das
DWORD in LowWord und HiWord aufzuteilen und ins eine den Pointer zu
setzen und ins andere das Flag. Reicht das LowWord dabei für einen
Pointer oder könnte der zu groß werden?
Zu Deiner Beruhigung, in neueren Versionen wurde dieses DWORD durch einen
UINT_PTR (oder so) ersetzt welches einen Integer von der Groesse eines
Pointers darstellt - in jedem Fall ist also Platz fuer einen Pointer, auch
wenn der Pointer groesser als ein DWORD ist wie es unter 64bit OSs der Fall
ist.
Nun zur Sache mit dem weiteren Flag: das geht so einfach nicht. Ich sehe
hier drei Varianten die Du machen kannst:
1. Du erzeugst parallel noch einen Container der einem Schluessel eine
Pointer/Flag Combo zuordnet und speicherst den Schluessel in dem CListCtrl.
Alternativ speicherst Du nur den Zeiger und machst eine Zuordnung vom
Zeiger zum Flag extern dazu.
2. Du erzeugst dynamisch eine Struktur die den Pointer und das Flag enthaelt
und speicherst den Zeiger auf diese Struktur. Alternativ integrierst Du das
Flag in das wo der Zeiger draufzeigt.
3. Du nutzt aus dass alles was groesser als ein Byte ist niemals auf einer
ungeraden Adresse beginnt, also etwa so:
DWORD dw = reinterpret_cast<DWORD>(ptr);
assert( dw&1u == 0u); // make sure the lowest bit is free
if(flag)
dw |= 1u;
Das ganze wird wohl funktionieren, ist aber nicht von C++ garantiert weil
reinterpret_cast so ziemlich alles machen darf (solange es reversibel ist)
und weil die Ausrichtung ('alignment') ebenfalls nicht zwingend existieren
muss.
Uli
.
- References:
- Frage zu DWORD
- From: Matthias Meier
- Frage zu DWORD
- Prev by Date: Re: Frage zu DWORD
- Next by Date: Re: GUI Libs
- Previous by thread: Re: Frage zu DWORD
- Next by thread: Suche Control
- Index(es):
Relevant Pages
|