Dynamische Namen für Array Variablen

  • Hi,

    hat jemand einen Tip für mich wie ich die Namen für Array-Variablen dynamisch vergeben kann.

    z.Bsp. so ...

    $i = 0
    $aArrayName & $i +1
    $aArrayName & $i +1
    $aArrayName & $i +1

    Mit "Assign" hab ich schon probiert, das funktioniert aber nicht für Arrays...

    Gruß

    Markus

    Einmal editiert, zuletzt von bordermax (22. Mai 2013 um 13:27)

  • In einer GUI werden von mir dynamisch Checkboxen angelegt. Die Anzahl der Checkboxen und deren Benamung werden aus einer SQL-Tabelle ermittelt.
    Bei der Benutzung der GUI muß ich je nach Status der Checkboxen pro Checkbox eine SQL-Tabelle abfragen. Damit ich nicht immer wieder diese Abfragen starten muß wollte ich mir am Anfang alle benötigten Infos in Arrays abspeichern. Die Anzahl der Arrays kann ja aber variieren da sie ja abhängig sind von der Anzahl der Checkboxen .... Verstanden ???

  • Zitat

    Die Anzahl der Arrays kann ja aber variieren da sie ja abhängig sind von der Anzahl der Checkboxen .... Verstanden ???

    Nein :S
    Die Anzahl der Arrays ist nur dann relevant, wenn die Checkboxen die maximal mögliche Anzahl überschreiten...
    Lege die Anzahl der Checkboxen(Arrays) auf 24345 fest.
    Wenn die Anzahl der Checkboxen diese Zahl überschreiten, dann musst du dir etwas einfallen lassen....
    Wenn die Anzahl der Checkboxen diese Zahl unterschreiten, dimensionierst du das Array per

    [autoit]

    REDIM()

    [/autoit]

    auf den gewünschten Wert.

  • Ich wüsste gerne warum du dazu mehrere Arrays brauchst. Normalerweise kann man in solchen Fällen auch mit mehrdimensionalen Arrays arbeiten. Eventuell könnte man auch Arrays verschachteln, falls nicht alle Checkboxen die selbe Anzahl an Infos haben.

  • Vielleicht hilft dir ja dieser Code-Schnipsel weiter:

    [autoit]

    Local $a[2] = ["First Element", "Second Element"]
    Local $sName = "test"

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

    Assign("var_" & $sName, $a)

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

    $aNew = Eval("var_" & $sName)
    If IsArray($aNew) Then
    For $i = 0 To UBound($aNew) - 1
    ConsoleWrite("$aNew[" & $i & "] = " & $aNew[$i] & @CRLF)
    Next
    Else
    ConsoleWrite($aNew & @CRLF)
    EndIf

    [/autoit]

    Ich glaube minx hat mir dieses Beispiel mal geschrieben. :D

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    • Offizieller Beitrag

    2 Dinge:
    - ArrayAdd ist eine "Spaß"bremse :D da es für jeden Eintrag ein ReDim ausführt. Viel besser, wie bereits erwähnt, ein großes Array deklarieren und nach dem Befüllen auf die Zahl der Einträge mit nur einem ReDim schrumpfen.
    - Eval ist so etwas wie "Es gibt wirklich keine Möglichkeit durch sauberes Programmieren das Problem zu lösen - dann kommt Eval zum Einsatz". ---- Also im Regelfall nie! Und wenn du es meiden kannst, dann tu es. Gewöhne dir das nicht erst an.

  • Hi,
    also ich hab vom ganzen überlegen schon einen Knoten im Hirn ...
    Ich versuch mal mit ein paar Zeilen nochmal zu zeigen was ich möchte.

    '$aTestArray' ist ein zweidimensionales Array
    _SQLAbfrage ist eine eigene Funktion zur Abfrage einer SQL-Datenbank

    For $i = 0 To UBound($aTestArray) -1
    $aQuery = _SQLAbfrage("hier wird jetzt für jedes Element aus $aTestArray eine SQL-Abfrage gestartet die unterschiedliche Informationen liefert")
    $aNeuerVariablerName = $aQuery.GetRows
    Next

    Was ich jetzt möchte ist einfach das $i-beliebige Arrays mit den Daten aus der jeweiligen SQL-Abfrage erstellt werden.
    Den Tip mit dem verschachtelten Array hier anzuwenden bekomm ich irgendwie nicht hin...

    Vielleicht bin ich vom vielen Überlegen auch komplett auf dem Holzweg, wer hat ne Idee für mich ?

  • [autoit]


    global $aTotal[10][2] ; array mit insgesamt 10 Zeilen und 2 Spalten, wobei die erste Spalte deine 10 variablen SQL Strings enthält und die 2. Spalte die Ergebnisse der SQL Queries
    ; ich gehe mal davon aus, dass du die erste Spalte selbst befüllt bekommst, haste ja schon im eigenen Beispiel so...

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

    For $i = 0 To UBound($aTestArray) -1
    $aQuery = _SQLAbfrage(".... hier dann dein variabler Qry Teil, also..." & $aTotal[$i][0])
    $aTemp = $aQuery.GetRows
    $aTotal[$i][1] = $aTemp ; das temporäre Ergebnisarray in die zweite Spalte des Gesamt Arrays kopieren
    Next

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

    ; Alle Ergenisarrays anzeigen
    For $i = 0 To UBound($aTestArray) -1
    _arraydisplay($aTotal[$i][1]) ; alle Inhalte der zweiten Spalte sind selbst Arrays und können somit in den Array Funktionen verwendet werden
    next

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

    ; einen Bestimmten Wert aus einem der Ergebnisarrays ausgeben
    $aTemp = $aTotal[2][1] ; Ergebnis Array des dritten SQL Queries
    consolewrite("1. Wert vom dritten SQL Query Ergebnis: " & $aTemp[0] & @crlf)

    [/autoit]

    So sollte es zumindestens theoretisch gehen, aber ich habe noch nie ineinander verschachtelte Arrays verwendet.

  • Hier nochmal ein anschaulicheres Beispiel, geht also tatsächlich so wie vermutet:

    [autoit]


    #include <array.au3>
    dim $aTest[3][2] = [["eins",""],["zwei",""],["drei",""]]
    dim $azwei[4] = [1,2,3,4]
    dim $adrei[4] = [5,6,7,8]

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

    $aTest[1][1] = $azwei
    $aTest[2][1] = $adrei

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

    _ArrayDisplay($aTest) ; das gesamte ober array, den inhalt der zweiten spalte sieht man nicht, aber es sind arrays enthalten, beweis siehe unten
    _ArrayDisplay($aTest[1][1])
    _ArrayDisplay($aTest[2][1])

    [/autoit]
  • hi,

    jetzt hab ich nur noch ein Problem.
    Mit _ArrayDisplay seh ich ja das Array im Array. Aber wie komme ich an die einzelnen Elemente heran um mit diesen zu arbeiten ?

  • Es gibt 2 Möglichkeiten:

    Spoiler anzeigen
    [autoit]

    Local $aOne[3], $aTwo[3], $aThree[2], $aTemp, $vElement

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

    $aOne[0] = 1
    $aOne[1] = 2
    $aOne[2] = 3

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

    $aTwo[0] = 4
    $aTwo[1] = 5
    $aTwo[2] = 6

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

    $aThree[0] = $aOne
    $aThree[1] = $aTwo

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

    $aTemp = $aThree[0]
    ConsoleWrite($aTemp[0] & @CRLF & _
    $aTemp[1] & @CRLF & _
    $aTemp[2] & @CRLF & @CRLF)

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

    For $vElement In $aThree[1]
    ConsoleWrite($vElement & @CRLF)
    Next

    [/autoit]