2D - DllStructs ?

  • Moin

    Und wiedereinmal bin ich an einem Punkt angelang wo ich nicht weiter komme, und nix im Internet finde was mir weiterhilft...
    Was ich brauche ist ein 2D Array in einem DllStruct (für die Übergabe an eine Dll)
    Die DllStructSetData funktion in AutoIt unterstützt nur einen Index. Ich bräuchte eine lösung in der ein weiterer Index hinzu kommt.

    Die funktion muss aber dennoch möglichst schnell sein. (ein [100][10] Array darf max 3-4ms brauchen... aber wirklich MAX)

    Hat jemand ne Idee ?

    [autoit]

    Local $Schuss_Struct = DllStructCreate('int a[100][9]')
    For $i = 0 To $Anzahl Step 1
    For $o = 0 To 8 Step 1
    DllStructSetData($Schuss_Struct, 'a['&$i+1&']', $Schuss[$i][$o], $o+1)
    Next
    Next

    [/autoit]

    Sieht schön aus, ist aber von vorne hinein zum Scheitern verdammt gewesen, weil ja der 2te Index fehlt^^

    mfg
    Mars(i)

  • Hi,
    stell dir mal vor, wie ein Bild (Bitmap, Höhe und Breite ist somit 2D) im linearen Speicher liegt....
    Genau so werden auch Arrays erstellt, oder glaubst du, für ein $ARRAY[][][][][] wird ein 5-Dimensionaler Speicher bereitgehalten^^

    /EDIT/
    "Array" [100][20] ;100 Spalten und 20 Zeilen
    dllstructcreate ( "int [100*20]") ;platz im speicher schaffen

    $array[70][8]
    $pos=dllstructgetptr()+100 * 8 (das sind die Zeilen) + 70 (in der 9.zeile der 70. Wert)

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (21. November 2010 um 19:42)

  • Die funktion muss aber dennoch möglichst schnell sein. (ein [100][10] Array darf max 3-4ms brauchen... aber wirklich MAX)


    Hallo marsi,

    das ist mir nicht gelungen, aber die folgenden Funktionen sind wenigstens nicht sehr weit entfernt, allerdings in Bezug auf die möglichen Strukturtypen nicht so flexibel wie der Vorschlag von BugFix:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $Rows = 100 ; Zeilenzahl
    $Cols = 10 ; Spaltenzahl
    $Type = "Int" ; Strukturtyp

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

    ; 2D-Array aufbauen, 0-basierte Indizes !
    Dim $A[$Rows][$Cols]
    For $I = 0 To $Rows - 1
    For $J = 0 To $Cols - 1
    $A[$I][$J] = ($I + 1) * 10 * ($J + 1)
    Next
    Next
    _ArrayDisplay($A, "Original 2D-Array")

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

    ; 2D-Array in DllStruct übertragen, 0-basierte Indices !
    $T = TimerInit()
    $S = _2DStructFromArray($A, "Int")
    $T = TimerDiff($T)
    ConsoleWrite("2D-Array --> DllStruct: " & Round($T) & " ms" & @CRLF)

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

    ; Get/SetData
    $I = 0
    $J = 0
    $V = 999999
    ConsoleWrite("GetData Row " & $I & " Col " & $J & " = " & _2DStructGetData($S, $I, $J, $Cols) & @CRLF)
    ConsoleWrite("SetData Row " & $I & " Col " & $J & " Wert " & $V & " = " & _2DStructSetData($S, $V, $I, $J, $Cols) & @CRLF)

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

    ; DllStruct -> 2D-Array, 0-basierte Indices !
    $T = TimerInit()
    $A = _2DStructToArray($S, $Rows, $Cols)
    $T = TimerDiff($T)
    ConsoleWrite("DllStruct --> 2D-Array: " & Round($T) & " ms" & @CRLF)
    _ArrayDisplay($A, '2D-Array aus DllStruct')

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

    Exit

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

    Func _2DStructFromArray(ByRef $aArray, $sType)
    ; $aArray = 0-basiertes 2D-Array
    ; $sType = Feldtyp für DllStruct
    Local $Rows = UBound($aArray, 1), $Cols = UBound($aArray, 2)
    Local $Struct = DllStructCreate($sType & " [" & ($Rows * $Cols) & "]")
    For $I = 0 To $Rows - 1
    For $J = 0 To $Cols - 1
    DllStructSetData($Struct, 1, $aArray[$I][$J], ($I * $Cols) + ($J + 1))
    Next
    Next
    Return $Struct
    EndFunc ;==>_2DStructFromArray

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

    Func _2DStructToArray(ByRef $tStruct, $iRows, $iCols)
    ; $tStruct = DllStruct
    ; $iRows = Zeilenzahl für das Array (1. Dimension)
    ; $iCols = Spaltenzahl für das Array (2. Dimension)
    Local $Array[$iRows][$iCols]
    For $I = 0 To $iRows - 1
    For $J = 0 To $iCols - 1
    $Array[$I][$J] = DllStructGetData($tStruct, 1, ($I * $iCols) + ($J + 1))
    Next
    Next
    Return $Array
    EndFunc ;==>_2DStructToArray

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

    Func _2DStructSetData(ByRef $tStruct, $vData, $iRow, $iCol, $iCols)
    ; $tStruct = DllStruct
    ; $vData = zu schreibender Wert
    ; $iRow = 0-basierter Zeilenindex (1. Dimension)
    ; $iCol = 0-basierter Spaltenindex (2. Dimension)
    ; $iCols = Spalten pro Zeile
    Return DllStructSetData($tStruct, 1, $vData, ($iRow * $iCols) + ($iCol + 1))
    EndFunc ;==>_2DStructSetData

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

    Func _2DStructGetData(ByRef $tStruct, $iRow, $iCol, $iCols)
    ; $tStruct = DllStruct
    ; $iRow = 0-basierter Zeilenindex (1. Dimension)
    ; $iCol = 0-basierter Spaltenindex (2. Dimension)
    ; $iCols = Spalten pro Zeile
    Return DllStructGetData($tStruct, 1, ($iRow * $iCols) + ($iCol + 1))
    EndFunc ;==>_2DStructGetData

    [/autoit]