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



    Und hier das Beispiel:




    Ich wünsche viel Spaß damit! :D

  • - 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:


    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.



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

    $bar = $foo


    ; zeugs ...


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