Container.au3 >> Dynamisches Array

  • Guten Tag AutoIt Community! :D
    Wie vielleicht eine Hand voll von euch wissen sollte, hatte ich mal mit "Containern" experimentiert. Die Aufgabe war es, ein Container (dynamisches Array) zu erstellen ohne externe Ressourcen. Ich habe daraus inzwischen eine ganze Funktion gemacht die ich gerne hier zeigen möchte. Vielleicht hilft es den einen oder anderen mal weiter oder gibt anreiz das ganze zu erweitern!

    Ich habe dazu noch ein Beispiel geschrieben um die Funktionsweise der Funktion zu verdeutlichen! :thumbup:


    Hier ist die Container.au3

    Spoiler anzeigen
    [autoit]

    ;// Container Return bei Erfolg:
    ;// -> Container erstellen Container() ID des Containers
    ;// -> Element hinzufügen Container(ID, 0, Wert) True
    ;// -> Element verändern Container(ID, Index, Wert) True
    ;// -> Element lesen Container(ID, Index) Inhalt des Containers
    ;// -> Element entfernen Container(ID, Index, Default*) True
    ;// -> Anzahl Elemente Container(ID) Anzahl der Elemente
    ;// -> Container löschen Container(ID, Default*) True
    ;// -> Anzahl Container Container(Default*) Anzahl der Container
    ;// -> Alle Container löschen Container(Default*, Default*) True
    ;// * Hier ist das Schlüsselwort "Default" anzugeben!

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

    Func Container($vID = 0, $vIndex = False, $vValue = 0)
    ;// Make-Grafik (http://www.autoit.de)
    If Not IsDeclared('avContainer') Then Global $avContainer[1]
    Local Static $iElement

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

    Local $bDefault
    If $vID = Default Then $bDefault = True

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

    Local $avNewContainer[1]
    Local $avTempArr
    Local $iCount

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

    If $vID = Default Then
    $avTempArr = $avContainer[0]
    Else
    $avTempArr = $avContainer[$vID]
    EndIf

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

    ;// Container erstellen
    If Not $vID And Not IsKeyword($vID) Then
    $avContainer[0] += 1
    $iElement += 1
    ReDim $avContainer[$iElement + 1]
    $avContainer[$iElement] = $avNewContainer
    Return $iElement

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

    ;// Element hinzufügen
    ElseIf $vID And Not $vIndex And Not IsBool($vIndex) And Not IsKeyword($vIndex) Then
    $avTempArr[0] += 1
    ReDim $avTempArr[$avTempArr[0] + 1]
    $avTempArr[$avTempArr[0]] = $vValue
    $avContainer[$vID] = $avTempArr
    Return True

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

    ;// Element verändern
    ElseIf $vID And $vIndex And $vValue Then
    $avTempArr[$vIndex] = $vValue
    $avContainer[$vID] = $avTempArr
    Return True

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

    ;// Element lesen
    ElseIf $vID And $vIndex And Not IsKeyword($vValue) Then
    Return $avTempArr[$vIndex]

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

    ;// Element entfernen
    ElseIf $vID And $vIndex Then
    $avTempArr[0] -= 1
    For $iCount = $vIndex To $avTempArr[0]
    $avTempArr[$iCount] = $avTempArr[$iCount + 1]
    Next
    ReDim $avTempArr[$avTempArr[0] + 1]
    $avContainer[$vID] = $avTempArr
    Return True

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

    ;// Anzahl Elemente
    ElseIf $vID And IsBool($vIndex) Then
    Return $avTempArr[0]

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

    ;// Container löschen
    ElseIf $vID Then
    Dim $avTempArr[1]
    $avContainer[$vID] = $avTempArr
    Return True

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

    ;// Anzahl Container
    ElseIf IsKeyword($vID) And Not IsKeyword($vIndex) Then
    Return $avContainer[0]

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

    ;// Alle Container löschen
    Else
    For $iCount = 1 To $avContainer[0]
    Container($iCount, Default)
    Next
    Return True

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

    EndIf
    EndFunc ;==>Container

    [/autoit]


    Und hier das Beispiel:

    Spoiler anzeigen
    [autoit]

    ; Was ist ein Container?
    ; Ein Container ist ein dynamisches Array! Die Funktion bietet folgende Möglichkeiten:

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

    #include "Container.au3"

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

    ; Container erstellen:
    ; Ein Aufruf ohne Parameter erstellt einen Container und gibt die ID aus um darauf zugreifen zu
    ; können.

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

    Global $idContainer = Container(), $iCounter

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

    ; Elemente hinzufügen:
    ; -> An den ersten Parameter wird die ID übergeben.
    ; -> Der zweite Parameter muss 0 sein (als Integer) um anzugeben dass ein neues Element erstellt
    ; werden soll. Dieser wird an den Container dran gehängt.
    ; -> Der dritte Parameter ist optional. Bleibt er leer, so wird in das Element der Integer 0
    ; geschrieben. Ansonsten kann man einen eigenen Wert festlegen. Strings, Integers, Floats und
    ; die Bool'schen Werte "True" und "False" sind erlaubt! Das Schlüsselwort "Default" ist für
    ; die innere verarbeitung in der Funktion reserviert!

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

    Container($idContainer, 0) ; Beinhaltet nun den Integer 0
    Container($idContainer, 0, "String")
    Container($idContainer, 0, 123)
    Container($idContainer, 0, 12.3)
    Container($idContainer, 0, True)

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

    ; Elemente verändern:
    ; Auch können Elemente verändert / überschrieben werden. Die Syntax ist die gleiche wie bei dem
    ; hinzufügen von Elementen. Nur dass an den zweite Parameter der Index übergeben wird. Ein
    ; Container beginnt mit dem Index 1!

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

    Container($idContainer, 1, 10)
    Container($idContainer, 5, False)

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

    ; Elemente lesen:
    ; Natürlich können Elemente auch wieder ausgelesen werden. Dafür wird die Syntax wie bei
    ; "Elemente verändern" verwendet nur ohne den dritten Parameter.

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

    ConsoleWrite(Container($idContainer, 2) & @CRLF)

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

    ; Element entfernen:
    ; Elemente können auch entfernt werden. Die Syntax ist die gleiche wie bei "Element hinzufügen"
    ; nur dass an den dritten Parameter das Schlüsselwort "Default" übergeben werden muss.

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

    Container($idContainer, 2, Default)
    ConsoleWrite(Container($idContainer, 2) & @CRLF)

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

    ; Anzahl Elemente:
    ; Um die Anzahl an Elementen in einen Container auszugeben, ist nur der erste Parameter zu
    ; verwenden!

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

    ConsoleWrite(@CRLF & Container($idContainer) & @CRLF)
    For $iCounter = 1 To Container($idContainer)
    ConsoleWrite(Container($idContainer, $iCounter) & @CRLF)
    Next

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

    ; Container löschen:
    ; Um den ganzen Inhalt eines Containers zu löschen, muss einfach nur der erste Parameter
    ; angegeben und der zweite mit dem Schlüsselwort "Default" besetzt werden. Einen ganzen
    ; Container komplett zu löschen würde in der derzeitigen Funktion nur zu einen ID Chaos führen.
    ; Ich werde das noch beheben!

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

    Container($idContainer, Default)
    Container($idContainer, 0, 'Alles gelöscht!')

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

    For $iCounter = 1 To Container($idContainer)
    ConsoleWrite(@CRLF & Container($idContainer, $iCounter) & @CRLF)
    Next

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

    ; Anzahl Container:
    ; Falls man irgendwann einmal wissen muss, wieviele Container angelegt wurden, dann kann muss
    ; nur an den erste Parameter das Schlüsselwort "Default" übergeben werden.

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

    ConsoleWrite(@CRLF & 'Anzahl Container: ' & Container(Default) & @CRLF)

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

    ; Alle Container löschen:
    ; Und um den Inhalt aller Container zu löschen, muss einfach an den ersten sowie zweiten
    ; Parameter das Schlüsselwort "Default" übergeben werden.

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

    Container(Default, Default)
    Container($idContainer, 0, 'Alles erneut gelöscht!')

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

    For $iCounter = 1 To Container($idContainer)
    ConsoleWrite(@CRLF & Container($idContainer, $iCounter) & @CRLF)
    Next

    [/autoit]


    Ich wünsche viel Spaß damit! :D

    • Offizieller Beitrag

    - Warum erstellst du das Array Global?
    Die Zugriffe erfolgen ausschließlich über die Funktion, somit wäre es sinnvoll das Array als Local Static zu erstellen. Allerdings hast du dann keine dynamische Größenveränderung des "Mutter-Arrays" mehr, da statisch erstellte Arrays in der Dimension nicht verändert werden können. Aber die Anzahl Container auf vorab 128 (oder ähnlich) festzulegen sollte eigentlich ausreichen. Die enthaltenen Element-Array sind ja weiterhin dynamisch.

    - Beim Hinzufügen eines Elementes ist nicht ersichtlich, welchen Index es im internen Array erhält (Return True). Insofern kann man nicht wieder auf das Element zugreifen. Hier solltest du den Array-Index zurückgeben.
    - "Container Löschen" ist etwas missverständlich, denn er existiert ja weiter als 1-Element-Array. Unter Löschen würde ich das kpl. Entfernen verstehen. - Besser wäre "Löschen aller Inhalte des Containers"

    Alternativ könntest du den Zugriff noch variabel gestalten, indem du als Index auch zusätzlich einen String zuläßt. Intern in einem Dictionary (wiederum Local Static) verweist du dann mit "String=Index" auf den Array Index.

    Da hier Array-In-Array verwendet wird, was leider keinen direkten Zugriff erlaubt, sondern immer das extrahieren des internen Arrays erfordert, wäre vielleicht auch interessant, dieselbe Funktion über ein Array mit ArrayList-Elementen zu realisieren.
    Ich habe das mal testweise erstellt. Es sind noch nicht alle Fehlerabfragen enthalten, aber zur Funktionsdemonstration reicht es:

    Spoiler anzeigen
    [autoit]

    $C1 = _Container()
    $C2 = _Container()
    ConsoleWrite('Anzahl Container: ' & _Container(0, -1, Default, 3) & @LF)

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

    $index1_1 = _Container($C1, -1, 'Neuer Wert1')
    ConsoleWrite("'" & _Container($C1, $index1_1) & "' in $C1 an Index=" & $index1_1 & " angefügt" & @LF)

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

    $index1_2 = _Container($C1, -1, 'Neuer Wert2')
    ConsoleWrite("'" & _Container($C1, $index1_2) & "' in $C1 an Index=" & $index1_2 & " angefügt" & @LF)

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

    ConsoleWrite('Anzahl Werte in $C1: ' & _Container($C1, -1, Default, 3) & @LF)

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

    _Container($C1, $index1_2, 'Geänderter Wert2')
    ConsoleWrite('Wert nach Änderung: ''' & _Container($C1, $index1_2) & "'" & @LF)

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

    $index2_1 = _Container($C2, -1, 'Neuer Wert1')
    ConsoleWrite("'" & _Container($C2, $index2_1) & "' in $C2 an Index=" & $index2_1 & " angefügt" & @LF)

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

    $index2_2 = _Container($C2, -1, 'Neuer Wert2')
    ConsoleWrite("'" & _Container($C2, $index2_2) & "' in $C2 an Index=" & $index2_2 & " angefügt" & @LF)

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

    Func _Container($indexContainer=0, $indexValue=-1, $Value=Default, $iFlag=0) ; $iFlag: 1=Delete Item/Delete Container, 2=Delete All Item/Container, 3=Count Item in Container/Count Container
    Local Static $aContainer[256] = [0] ; Statische Variablen können nicht mit ReDim verändert werden! Deshalb vordefinieren
    Local Static $indexLast = 0

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

    Select
    Case $indexContainer = 0 And $iFlag = 0 ; neuer Container
    $aContainer[0] += 1
    $indexLast += 1
    $aContainer[$indexLast] = _ObjAListCreate() ; ArrayList als Element erstellen
    Return $indexLast ; Rückgabe Index Container

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

    Case $indexContainer > 0 And $indexValue = -1 And $iFlag = 1 ; Delete Container
    $aContainer[$indexContainer] = 0 ; dadurch ändert sich Index der verbleibenden Container nicht
    $aContainer[0] -= 1

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

    Case $indexContainer > 0 And $indexValue = -1 And $iFlag = 2 ; Delete All Container
    $aContainer[0] = 0
    For $i = 1 To UBound($aContainer) -1
    $aContainer[$i] = 0
    Next

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

    Case $indexContainer = 0 And $indexValue = -1 And $iFlag = 3 ; Count Container
    Return $aContainer[0]

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

    Case $indexContainer > 0 And $iFlag = 3 ; Count Item in Container
    Return $aContainer[$indexContainer].Count

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

    Case IsKeyword($Value) And $iFlag = 0 ; Get Value
    Return _ObjAListGetItem($aContainer[$indexContainer], $IndexValue)

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

    Case IsKeyword($Value) And $iFlag = 1 ; Delete Value
    _ObjAListDelByIndex($aContainer[$indexContainer], $IndexValue)

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

    Case IsKeyword($Value) And $iFlag = 2 ; Delete All Value
    _ObjAListClear($aContainer[$indexContainer])

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

    Case Not IsKeyword($Value) And $indexValue = -1 ; Add Item
    Return _ObjAListAdd($aContainer[$indexContainer], $Value) ; Rückgabe Index aus ArrayList

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

    Case Not IsKeyword($Value) And $indexValue > -1 ; Set Value
    _ObjAListSetItem($aContainer[$indexContainer], $indexValue, $Value)

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

    EndSelect

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

    EndFunc

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

    ;==================================================================================================
    ; Name: _ObjAListCreate()
    ; Return: Erfolg: Handle des Arraylist-Objektes
    ; Fehler: -1
    ; Fehlerwert: 1 Objekt konnte nicht erzeugt werden
    ;==================================================================================================
    Func _ObjAListCreate()
    Local $obj = ObjCreate("System.Collections.ArrayList")
    If (Not IsObj($obj)) Then
    Return SetError(1, 0, -1)
    Else
    Return $obj
    EndIf
    EndFunc ;==>_ObjAListCreate

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

    ;==================================================================================================
    ; Name: _ObjAListAdd($ObjList, $Value)
    ; Parameter: $ObjList - Handle des Arraylist-Objektes
    ; $Value - Wert
    ; Return: Erfolg: Index des angefügten Item
    ; Fehler: -1
    ; Fehlerwert: 1 Objekt existiert nicht
    ; 2 Wert ohne Inhalt übergeben
    ; 3 Aktion fehlgeschlagen
    ;==================================================================================================
    Func _ObjAListAdd(ByRef $ObjList, $VALUE = '')
    If (Not IsObj($ObjList)) Then Return SetError(1, 0, -1)
    If $VALUE = '' Then Return SetError(2, 0, -1)
    $ObjList.Add($VALUE)
    If @error Then Return SetError(3, 0, -1)
    Return $ObjList.Count - 1
    EndFunc ;==>_ObjAListAdd

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

    ;==================================================================================================
    ; Name: _ObjAListGetItem($ObjList, $Index)
    ; Parameter: $ObjList - Handle des Arraylist-Objektes
    ; $Index - Index des zurückzugebenden Wertes
    ; Return: Erfolg: 0
    ; Fehler: -1
    ; Fehlerwert: 1 Objekt existiert nicht
    ; 4 Index außerhalb Bereich
    ;==================================================================================================
    Func _ObjAListGetItem(ByRef $ObjList, $Index)
    If (Not IsObj($ObjList)) Then Return SetError(1, 0, -1)
    If ($Index = -1) Or ($Index > $ObjList.Count - 1) Then Return SetError(4, 0, -1)
    Return $ObjList.Item($Index)
    EndFunc ;==>_ObjAListGetItem

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

    ;==================================================================================================
    ; Name: _ObjAListSetItem($ObjList, $Index, $Value)
    ; Parameter: $ObjList - Handle des Arraylist-Objektes
    ; $Index - Index des zurückzugebenden Wertes
    ; $Value - Neuer Wert des Item
    ; Return: Erfolg: 0
    ; Fehler: -1
    ; Fehlerwert: 1 Objekt existiert nicht
    ; 4 Index außerhalb Bereich
    ;==================================================================================================
    Func _ObjAListSetItem(ByRef $ObjList, $Index, $Value)
    If (Not IsObj($ObjList)) Then Return SetError(1, 0, -1)
    If ($Index = -1) Or ($Index > $ObjList.Count - 1) Then Return SetError(4, 0, -1)
    $ObjList.Item($Index) = $Value
    Return 0
    EndFunc ;==>_ObjAListGetItem

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

    ;==================================================================================================
    ; Name: _ObjAListDelByIndex($ObjList, $Index)
    ; Parameter: $ObjList - Handle des Arraylist-Objektes
    ; $Index - Index des zu löschenden Wertes
    ; Return: Erfolg: 0
    ; Fehler: -1
    ; Fehlerwert: 1 Objekt existiert nicht
    ; 3 Aktion fehlgeschlagen
    ; 4 Index außerhalb Bereich
    ;==================================================================================================
    Func _ObjAListDelByIndex(ByRef $ObjList, $Index = -1)
    If (Not IsObj($ObjList)) Then Return SetError(1, 0, -1)
    If ($Index = -1) Or ($Index > $ObjList.Count - 1) Then Return SetError(4, 0, -1)
    $ObjList.RemoveAt($Index)
    If @error Then Return SetError(3, 0, -1)
    Return 0
    EndFunc ;==>_ObjAListDelByIndex

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

    ;==================================================================================================
    ; Name: _ObjAListClear($ObjList)
    ; Parameter: $ObjList - Handle des Arraylist-Objektes
    ; Return: Erfolg: 0
    ; Fehler: -1
    ; Fehlerwert: 1 Objekt existiert nicht
    ; 3 Aktion fehlgeschlagen
    ;==================================================================================================
    Func _ObjAListClear(ByRef $ObjList)
    If (Not IsObj($ObjList)) Then Return SetError(1, 0, -1)
    $ObjList.Clear
    If @error Then Return SetError(3, 0, -1)
    Return 0
    EndFunc ;==>_ObjAListClear

    [/autoit]

    Edit:
    Es ist zwar praktisch, wenn man nur eine Funktion aufrufen muß und über die Parameter(-kombination) dann unterschiedliche Funktionen ausgeführt werden - aber so richtig übersichtlich ist es nicht.
    Was spricht dagegen, die Aufrufe für die Einzelaktionen in extra Funktionen auszulagern ( Contaier_New, Container_SetVal, Container_GetVal, .... )? Das erleichtert die Lesbarkeit des Skripts ungemein. :D
    Alternativ wäre auch möglich eine Funktion zu verwenden mit einem Cmd-String als Parameter " Func Container($sCmd, $param1, $param2,...) " und als $sCmd= "new", "addVal", "getVal", "setVal" usw. ;)

  • Zu dem lokalen statischen Array:
    Dies war meine erste Überlegung! Aber ich wollte einfach nur so wenig Speicherplatz wie möglich verbrauchen und nichts vorher reservieren. Dynamisch ist es ja erst deshalb, weil die Speichergröße von beginn der Scriptes nicht festgelegt werden kann bzw. Es man nicht festlegen sollte. Zudem wäre man auch auf eine gewisse Containergröße eingeschränkt. Ich persönlich würde lieber bis zu der Grenze von AutoIt bzw. Des Computers gehen! :)

    Zu dem Hinzufügen des Containers:
    Setz den Rückgabewert einfach auf $avTempArr[0]! Dort drin wird die Anzahl der Container gespeichert. Im Grunde steht der Index des Angelegten Elements dort drin! ^^

    Zu dem Container löschen:
    Das Problem ist: Die ID's der vorherigen Containers würden nicht mehr stimmen. Um exakt zu sein sind es die Container die eine höhere ID haben als der gelöschte Container. Ich will und kann den Programmierer nicht zumuten, die ID's selbstständig um 1 zu verringern. Da will ich mir noch was für meine Funktion einfallen lassen. ^^
    Die Umsetzung folgt noch! :P

    Zu dem Stringzugriff:
    Wäre noch eine Option! Aber ich sehe da keinen größeren Sinn... Wenn es die Übersichtlichkeit des Codes erhöhen soll, man kann die Variablen ja dementsprechend benennen.

    Selbstverständlich kann man die Funktion auch auf mehrere verteilen. Allerdings wollte ich es versuchen in eine Funktion zusammen zu setzen! Man kann sich ja selber ne Funktion schreiben welches die Container() Funktion mit den nätigen Parametern aufruft! Ist ja nicht so schwer! ^^

    So einen "CMD" -Parameter kann man sicherlich noch als Zusatz einbauen. Oder vielleicht auch diese ganzes Parameter Wirr-Warr ersetzen. Es wäre dann einfacher weitere Funktionen in den Container() einzufügen. Kann man ja drauf umsteigen. ^^

    PS: Solche Zeilen hier "ObjCreate("System.Collections.ArrayList")" wollte ich nicht verwenden. Es war einfach eine Übung um sowas selber zu basteln! Ich denke, dass habe ich schon befriedigend umgesetzt. ^^ Werde dann bei Gelegenheit (also Heute) noch verschlimmbessern! :P

  • Die Zugriffe erfolgen ausschließlich über die Funktion, somit wäre es sinnvoll das Array als Local Static zu erstellen. Allerdings hast du dann keine dynamische Größenveränderung des "Mutter-Arrays" mehr, da statisch erstellte Arrays in der Dimension nicht verändert werden können. Aber die Anzahl Container auf vorab 128 (oder ähnlich) festzulegen sollte eigentlich ausreichen. Die enthaltenen Element-Array sind ja weiterhin dynamisch.

    [autoit]


    Func _foobar()
    Local Static $foo[1]
    Local $bar

    $bar = $foo

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

    ; zeugs ...

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

    ReDim $bar[ .. ]
    $foo = $bar
    EndFunc

    [/autoit]
  • Hehe :x
    Dahinter bin ich auch gekommen...
    Sollte eigentlich in meine "verschlimmbesserung" folgen ^^

    Wollte ich nur noch nicht verraten. ^^
    Trzd. Danke :)