DllStructCreate und BitFields?!

    • Offizieller Beitrag

    Hey!

    Mal wieder ein Struct Problem... Habe in C z.B. folgende Struktur:

    Spoiler anzeigen

    Wie man sieht hat die Struktur testBitField Bit fields! Das heißt eine Variable Benutzt nur ein Bit (nicht byte!) Trotzdem ist die Struktur insgesamt 4 Byte groß, ich schätze mal das hat mit dem Aligment zu tun, ist aber auch egal!

    Was mich nun wundert: Wenn ich die Struktur wie folgt mache:

    [autoit]

    ;same structure as in C
    Global $tagStructTest = "int Wert1;byte testBitField[4];int Wert2;"

    [/autoit]

    und testBitField auslese, kann ich zwar mit BitAnd gucken ob Param1 oder Param2 1 oder 0 sind (BitAnd($tBla...,1) und BitAnd($tBla...,2)) aber das restliche testBitField ist mit irgend einem Mist zugetextet. Erst dachte ich, es wäre irgendwas zufälliges, aber es scheint immer die gleiche Zahl zu sein. Wert1 und Wert2 wird aber sonst auch richtig angezeigt. (in meinem Beispiel
    0x2439E500 wenn Parm1 = 0 und Parm2 = 0,
    0x2539E500 wenn Parm1 = 1 und Parm2 = 0,
    0x2639E500 wenn Parm1 = 1 und Parm2 = 1,
    0x2739E500 wenn Parm1 = 1 und Parm2 = 1.)

    Was sind das für Zahlen? Kann ich die einfach getrost ignorieren? Bzw einfach mit nullen überschreiben?
    Oder gibt es gar eine Möglichkeit diese Bitfields in AutoIt auch irgendwie umzusetzen?

    Gruß,
    Spider

  • Mir ist aufgefallen dass ein Programm meist die gleiche Adresse für Variablen verwendet. Warum das so ist kann ich nicht sagen, aber folgender FreeBASIC Code gibt mir immer als Adresse "1638080" oder auch 0x0018FEC0 aus. Wenn ich nun die Adresse beispielsweise mit Cheat Engine überprüfe, wird mir der richtige Wert angezeigt.

    Hier der code:

    Code
    Dim As Integer x = 5
    Print
    Print "  "; @x
    Print
    Sleep

    Die anderen Bits gehören zu dem Wert, der vorab in der Adresse gespeichert wurde. Weil du mit den Bitfelder eben nur einzelne Bits änderst, bleiben die anderen unberührt. Die ganze Adresse wird (obwohl vielleicht nur 2 Bits in der Struktur genutzt werden) für andere Programme gesperrt. Das bedeutet, dass du diese getrost überschreiben kannst.

    ~ Make =)

  • Reservierst du diesen Speicherbereich in AutoIt mit DllStructCreate?
    Wenn ja, dann sollten die 4 Bytes mit Nullen gefüllt sein.

    Wenn du den Speicher in C reservierst, dann bleiben evtl. die alten Werte im Speicher bestehen.
    Diese kannst du mit Nullen überschreiben.

    Deine Vorgehensweise mit BitAnd und BitOr ist korrekt und wird auch von C verwendet, um die BitFields zu schreiben


    Falls du den Speicher am Anfang auf Null resettet hast und trotzdem diese komischen Zahlen auftauchen, dann gibt es irgendwo ein Problem

    E

  • Hi,

    Zitat

    Wenn du den Speicher in C reservierst, dann bleiben evtl. die alten Werte im Speicher bestehen.

    nicht nur eventuell...abgesehen von mehreren Möglichkeiten, im "C-Style" Speicher anzufordern, ist es bspw. bei Malloc() nicht möglich, den Speicherbereich zu "nullen", während es bei Local/GlobalAlloc() und VirtualAlloc() machbar ist, über diverse Flags ( bspw. MEM_COMMIT) die Bytes im angeforderten Speicher alle auf null zu setzen.
    In C++ will ich nicht wissen, welche der "alten" Funktionen recycled werden, viel schlimmer noch und mittlerweile üblich ist dort von "greater overhead" zu lesen....irgendwie müssen die immer schnelleren Prozessoren doch von der Software ausgebremst werden 8)