Hallo zusammen,
beim Arbeiten mit structs ist mir etwas aufgefallen, was ich so nicht erwartet hätte:
Wenn man eine Struct mit
$struct1=dllstructcreate(byte[8])
[/autoit]erstellt, dann hat diese Struct eine Größe von 8 Byte, soweit klar!
Aber!
Erstellt man nun eine struct, welche genau "über" der andern struct liegt (bzw an deren Position im Speicher) dann sieht man, daß die Elemente in einer Struct immer so groß sind (Bitanzahl) wie das größte Einzelelement.
Bsp:
$struct1=dllstructcreate("byte[12]") ;12 Byte
$struct2=DllStructCreate("byte;int;byte",dllstructgetptr($struct1)) ;6 Byte an der Position von struct1
;schreiben in die struct2, real geschrieben wird an position der struct1
dllstructsetdata($struct2,1,0xAB) ;1 Byte
dllstructsetdata($struct2,2,0xAABBCCDD) ;4 Byte
dllstructsetdata($struct2,3,0xBA) ;1 Byte
;nun sollte man erwarten, daß (little endian) der Inhalt der struct1 "ABDDCCBBAABA" ist...byte&int&byte=6 byte
[/autoit][autoit][/autoit][autoit];lesen der Daten von struct1
$wert=dllstructgetdata($struct1,1) ;12 byte werden gelesen, aber der Inhalt ist AB000000DDCCBBAABA000000 also nicht ABDDCCBBAABA
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $wert = ' & $wert & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
;sieht man auch an den pointern
$p1=dllstructgetptr($struct2,1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $p1 = ' & $p1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$p2=dllstructgetptr($struct2,2)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $p2 = ' & $p2 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$p3=dllstructgetptr($struct2,3)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $p3 = ' & $p3 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
;der abstand der pointer beträgt 4 byte
das heißt, daß obwohl bei der Definition der struct2 für das erste Element als Größe 1 Byte angegeben wird, ist der tatsächliche "Speicherverbrauch" 4 Byte. Wieso das?
Bei einer struct von "byte;int64;byte" ist die tatsächliche Größe nicht 1+8+1 bytes sondern 3*8 Bytes, gibts dafür einen Grund?