Re: Frage zu DWORD

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



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

.



Relevant Pages

  • Re: gdb help: debugging a segfault in boost::shared_ptr
    ... I moved the pointer from one list to another, ... only failed when using multi-threading is because the memory was ... the binary is compiled and linked with -pthread flag, ...
    (comp.unix.programmer)
  • Managing userland data pointers in kqueue/kevent
    ... pointer to some user-provided Perl data structure, ... To account for the fact that the kernel stores a pointer here, ... Store a structure in the void *udata that contains the actual SV* ... By the addition of a new event flag, ...
    (freebsd-hackers)
  • Re: Nested Casts
    ... >up the old pointer to mean something new, in this case also a pointer. ... term "red flag", too. ... one for wstring items was a little more trouble. ... I have working code, ...
    (alt.comp.lang.learn.c-cpp)
  • Re: linked list question
    ...   struct node *next; ... When you find a set flag, ... bit-reversed pointer. ... consider a structure that has three char members. ...
    (comp.lang.c)
  • Re: Mach-O binary format support and Darwin syscall personality [Was: uts banner changes]
    ... it may actually make sense to actually stick the whole "syscall ... table pointer" in there, rather than a flag that says which pointer to ... easier to load the syscall table pointer right off there, ...
    (Linux-Kernel)