• Offizieller Beitrag

    Im Forum war die Frage nach "2D" Strukturen aufgetaucht.
    Natürlich gibt es keine 2D-Strukturen, die Daten liegen (ebenso wie bei Arrays) hintereinander im Speicher. Man kann aber den Zugriff so gestalten, dass ein Zeilen/Spalten -Effekt wirksam ist. Inwiefern das jetzt sinnvoll zu nutzen ist, muß jeder selbst entscheiden.
    Ich habe mal Funktionen für "2D"-Strukturen mit Bsp. erstellt.

    Dll_Struct_2D
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _CreateByteArray2D
    ; Description ...: Erstellt die Struktur Bytearray im Zugriffs-Stil eines Array-2D
    ; Syntax.........: _CreateByteArray2D($sType, $iRows, $iCols)
    ; Parameters ....: $sType String zu speichernder Datentyp
    ; $iRows Anzahl Zeilen
    ; $iCols Anzahl Spalten
    ; Return values .: Bytearray-Struktur
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; Remarks .......: Zusätzlich zu den Daten werden Größe und Name des verwendeten Datentyps und die Größe der Dimensionen
    ; in der Struktur hinterlegt
    ; ===============================================================================================================================
    Func _CreateByteArray2D($sType, $iRows, $iCols)
    Local $iSize = DllStructGetSize(DllStructCreate($sType, 1))
    Local $aByte = DllStructCreate('byte[' & $iSize *$iRows *$iCols & "];int size;wchar type[128];int ubound[2]")
    DllStructSetData($aByte, 'size', $iSize)
    DllStructSetData($aByte, 'type', $sType)
    DllStructSetData($aByte, 'ubound', $iRows, 1)
    DllStructSetData($aByte, 'ubound', $iCols, 2)
    Return $aByte
    EndFunc ;==>_CreateByteArray2D

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _SetValToByteArray2D
    ; Description ...: Überträgt einen Wert an eine definierte Position im Bytearray
    ; Syntax.........: _SetValToByteArray2D($aByte, $vVal, $iRow, $iCol)
    ; Parameters ....: $aByte die Struktur Bytearray
    ; $vVal der einzutragende Wert
    ; $iRow Index Zeilenposition (0-basiert)
    ; $iCol Index Spaltenposition (0-basiert)
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; Remarks .......: Die Plausibilitätsprüfung der einzutragenden Werte bzgl. des verwendeten Datentyps ist vorher sicherzustellen
    ; ===============================================================================================================================
    Func _SetValToByteArray2D(ByRef $aByte, $vVal, $iRow, $iCol)
    Local $sType = DllStructGetData($aByte, 'type')
    Local $iSize = DllStructGetData($aByte, 'size')
    Local $Ub2 = _GetUBoundFromByteArray2D($aByte, 2)
    Local $iShiftPtr = ($iRow * $Ub2 * $iSize) + ($iCol * $iSize)
    Local $tmpStruct = DllStructCreate($sType, DllStructGetPtr($aByte) +$iShiftPtr)
    DllStructSetData($tmpStruct, 1, $vVal)
    EndFunc ;==>_SetValToByteArray2D

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GetValFromByteArray2D
    ; Description ...: Liest einen Wert aus einer definierten Position im Bytearray
    ; Syntax.........: _GetValFromByteArray2D($aByte, $iRow, $iCol)
    ; Parameters ....: $aByte die Struktur Bytearray
    ; $iRow Index Zeilenposition (0-basiert)
    ; $iCol Index Spaltenposition (0-basiert)
    ; Return values .: Der gelesene Wert
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; ===============================================================================================================================
    Func _GetValFromByteArray2D(ByRef $aByte, $iRow, $iCol)
    Local $sType = DllStructGetData($aByte, 'type')
    Local $iSize = DllStructGetData($aByte, 'size')
    Local $Ub2 = _GetUBoundFromByteArray2D($aByte, 2)
    Local $iShiftPtr = ($iRow * $Ub2 * $iSize) + ($iCol * $iSize)
    Local $tmpStruct = DllStructCreate($sType, DllStructGetPtr($aByte) +$iShiftPtr)
    Return DllStructGetData($tmpStruct, 1)
    EndFunc ;==>_GetValFromByteArray2D

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GetUBoundFromByteArray2D
    ; Description ...: Gibt die Größe der verwendeten Dimensionen zurück
    ; Syntax.........: _GetUBoundFromByteArray2D($aByte, $iDim = 1)
    ; Parameters ....: $aByte die Struktur Bytearray
    ; $iDim die Dimension, deren Größe erfragt wird, Standard = 1
    ; Return values .: Größe der Dimension (Anzahl Elemente)
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; ===============================================================================================================================
    Func _GetUBoundFromByteArray2D(ByRef $aByte, $iDim = 1)
    If $iDim < 1 Then $iDim = 1
    If $iDim > 2 Then $iDim = 2
    Return DllStructGetData($aByte, 'ubound', $iDim)
    EndFunc ;==>_GetUBoundFromByteArray2D

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ByteArray2DToArray
    ; Description ...: Überträgt die Daten aus dem Bytearray in ein klassisches 2D-Array
    ; Syntax.........: _ByteArray2DToArray($aByte)
    ; Parameters ....: $aByte die Struktur Bytearray
    ; Return values .: Ein klassisches 2D-Array mit allen Werten aus der Struktur
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; ===============================================================================================================================
    Func _ByteArray2DToArray(ByRef $aByte)
    Local $iRows = _GetUBoundFromByteArray2D($aByte)
    Local $iCols = _GetUBoundFromByteArray2D($aByte, 2)
    Local $a[$iRows][$iCols]
    For $i = 0 To $iRows -1
    For $j = 0 To $iCols -1
    $a[$i][$j] = _GetValFromByteArray2D($aByte, $i, $j)
    Next
    Next
    Return $a
    EndFunc ;==>_ByteArray2DToArray

    [/autoit]
    Bsp.
    [autoit]

    #include 'Dll_Struct_2D.au3'

    [/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; === 2d-Array / "2D-Struktur" (Integer Daten)
    Local $a[10][5]
    Local $2D_Struct = _CreateByteArray2D('int', 10, 5)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 9
    For $j = 0 To 4
    $a[$i][$j] = ($i+1) *10 *($j+1)
    _SetValToByteArray2D($2D_Struct, ($i+1) *10 *($j+1), $i, $j)
    Next
    Next
    _ArrayDisplay($a, 'Original 2D Array')

    [/autoit] [autoit][/autoit] [autoit]

    $a1 = _ByteArray2DToArray($2D_Struct)
    _ArrayDisplay($a1, 'aus Struktur erstelltes 2D Array')

    [/autoit] [autoit][/autoit] [autoit]

    ; === Daten aus Struktur gelesen ==> Ausgabe Console
    For $i = 0 To 9
    For $j = 0 To 4
    ConsoleWrite(_GetValFromByteArray2D($2D_Struct, $i, $j) & ' ')
    Next
    ConsoleWrite(@CRLF)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; === "2D-Struktur" (Datentyp Zeichen)
    Local $2D_Struct_str = _CreateByteArray2D('char[128]', 5, 2)
    Local $n = 65
    For $i = 0 To 4
    _SetValToByteArray2D($2D_Struct_str, Chr($n), $i, 0)
    _SetValToByteArray2D($2D_Struct_str, Chr($n+32), $i, 1)
    $n += 1
    Next
    $a2 = _ByteArray2DToArray($2D_Struct_str)
    _ArrayDisplay($a2, 'String-Strukt als Array')

    [/autoit]