Werte aus/in Sub-Array direkt lesen/schreiben

  • Edit 27.07.07 [alles gaaanz neu]


    Da AutoIt die Möglichkeit bietet, in einem Array als Elemente Arrays abzulegen, habe ich eine Funktion erstellt, die ein direktes Auslesen und auch Schreiben von Sub-Arrayelementen ermöglicht.


    In der aktualisierten Version sind nun bei Parent-Array und auch bei Sub-Array 2D-Arrays einsetzbar ohne Limitierung.


    _SubArray2DGetEntry($ARRAY, $SubRow, $ParentRow [, $SubCol=-1 [, $ParentCol=-1])


    _SubArray2DSetEntry($ARRAY, $Entry, $SubRow, $ParentRow [, $SubCol=-1 [, $ParentCol=-1])


    - $ARRAY ==> Ausgangsarray
    - $Entry ==> Nur bei ...SetEntry(), der zu setzende Wert
    - $SubRow ==> Zeilen-Index Sub-Array
    - $ParentRow ==> Zeilen-Index Parent-Array (enthält das Sub-Array
    - $SubCol=-1 ==> Spalten-Index Sub-Array, Standard ist -1 ==> nur 1D
    - $ParentCol=-1 ==> Spalten-Index Parent-Array, Standard ist -1 ==> nur 1D


    Das Bsp.ist auch aktualisiert:


  • HI,


    irgendwie reden wir aneinander vorbei. Ich hoffe mal, dass ich es nicht falsch verstehe. :D


    Also mal etwas ausführlicher:


    MsgBox(0, '', _SubArrayGetEntry($ar2, 1, 2, 2)) ; = $ar2[2][2] Idx 1 = $ar1_5[1] ==> 13


    In dieser Zeile rufst du deine Funktion auf (UDF) und übergibst das Array names $ar2, richtig?


    Wenn du in deiner Funktionsdeklaration das ganze so schreibst :

    Func _SubArrayGetEntry($ARRAY, $SubIdx, $iDim1, $iDim2=-1)


    dann wird das Array im Speicher (obwohl es bereits drin ist) kopiert und anschließend bearbeitet.


    Dies könntest du vermeiden, wenn du ByRef nutzt, dann wird ein Pointer auf die Speicheradresse übergeben und das Originalarray analysiert.


    Da du keine Zuweisungen innerhalb deiner Funktion machst, wird das Oridinalarray auch nicht manipuliert.


    Dies sollte gerade bei großen Arrays mit ByRef schneller sein und außerdem ist bei deiner Funktion (wenn ich es richtig verstanden habe) die Kopierfunktion unnötig.


    So long,


    Mega

  • Zitat

    irgendwie reden wir aneinander vorbei. Ich hoffe mal, dass ich es nicht falsch verstehe.


    Den Eindruck hatte ich auch :D - Vielleicht solltest du nicht immer so wortkarg sein ? :P


    Ich stimme dir völlig zu. :)
    Dann wäre es doch eigentlich sinnvoll, wenn in AutoIt-Funktionen die Parameter ohne besondere Kennzeichnung als ByRef betrachtet werden. Für die Mehrzahl der Parameter ist doch eine ByRef-Übergabe sinnvoll - oder? Ausnahmen könnte man dann mit ByVal festlegen (gibts halt in AutoIt nicht explizit, alle Argumente sind ja automatisch ByVal). Kann mich schwach an meine VB-Übungen erinnern, da mußte man das sowieso festlegen.