- 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
; #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
; #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
; #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
; #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
; #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
Bsp.
#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)
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')
$a1 = _ByteArray2DToArray($2D_Struct)
_ArrayDisplay($a1, 'aus Struktur erstelltes 2D Array')
; === 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
; === "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')