Name einer Array-Variablen zusammen setzen

  • Normale Variablennamen lassen sich aus Text und Variableninhalten mittels "&" zusammen setzen.

    $i = 2
    $Variable = "Name"
    $Variable_neu = $Variable & $i
    MsgBox (0,"Variable", $Variable_neu)

    Das angezeigte Ergebnis lautet: Name2
    Das ist einfach... :)

    Wie erreiche ich das aber bei Array-Namen? ?(
    Ich habe diverse Arrays mit laufender Nummer definiert.
    Dim $Array1 [4] = ["A", "B","C", "D"]
    Dim $Array2 [4] = ["1", "2", "3", "4"]
    Dim $Array3 [4] = ["X", "Y", "Z","ß"]
    Dim $Array4 [4] ...
    Dim $Array5 [4] ...
    ...
    In späteren Schleifen-Algorithmen möchte ich in einzelnen Durchläufen die diversen Arrays anhand der lfd. Nummer im Namen ansprechen können.
    Das Zusammensetzen des Namens ala einfache Variable funktioniert aber nicht.
    So kommt es bei z.B.
    ..... "$Array & $i[2])"
    zu der Fehlermeldung, dass die einfache Variable $Array noch nicht deklariert wurde.
    Was natürlich stimmt, sie entspricht ja auch nicht der Array-Variablen $Array"X"[y]!

    Wie baue ich mir den Arraynamen korrekt zusammen?

    - Rasta -

    Spoiler anzeigen

    Dim $Array1 [4] = ["A", "B","C", "D"]
    Dim $Array2 [4] = ["1", "2", "3", "4"]
    Dim $Array3 [4] = ["X", "Y", "Z","ß"]

    For $i = 1 To 3
    MsgBox(0,"3. Array-Wert von Array Nr." & $i, $Array & $i[2])
    Next

    Einmal editiert, zuletzt von Rasta (1. Oktober 2008 um 13:23)

  • Moin,

    eine Möglichkeit wäre:

    [autoit]


    Global $variable
    If Assign("variable", "Hello") Then MsgBox(4096, "", $variable) ; Will print "Hello"

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

    Dim $a_b = 12
    $s = Eval("a" & "_" & "b") ; $s is set to 12

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

    $s =Eval("c") ; $s = "" and @error = 1

    [/autoit]


    Gruß
    Greenhorn


  • Sorry, Greenhorn,
    ich versteh nicht, was Du meinst, dass mir "Eval(...)" helfen könnte.
    Hab eben damit rumprobiert, finde aber nicht den springenden Punkt.

    Kannst Du das vielleicht an meinem Beispiel erläutern - wäre nett.

    -Rasta-

  • Sorry,

    wieder zuviel billigen Wein getrunken, heute Morgen :rolleyes:

    Assign ist das Schlüsselwort, aber ...

    [autoit]

    Dim $Array_1 [12]
    Dim $Array_2 [12]
    Dim $Array_3 [12]
    Dim $Array_4 [12]

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

    For $i = 1 To 4

    Assign ('Array_'&$i&' [0]', 'Wert'&$i)

    Next

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

    _ArrayDisplay ($Array_2)

    [/autoit]


    ...funzt nicht mit Arrays.

    Du müsstest ein Zweidimensionales Array erzeugen und dann halt $Array [$i][0] usw. benutzen, anstatt $Array_1 ...


    Gruß
    Greenhorn


    • Offizieller Beitrag

    Hi,

    oder

    [autoit]

    Dim $Array1[4] = ["A", "B", "C", "D"]
    Dim $Array2[4] = ["1", "2", "3", "4"]
    Dim $Array3[4] = ["X", "Y", "Z", "ß"]
    Dim $arrays[3] = [$Array1, $Array2, $Array3]

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

    For $y = 0 To UBound($arrays) - 1
    $a = $arrays[$y]
    For $i = 0 To UBound($a) - 1
    ConsoleWrite("Array-Wert von Array Nr." & $i & " " & $a[$i] & @CRLF)
    Next
    Next

    [/autoit]

    Mega

  • Es gibt eine elegante Möglichkeit bei der Dimensionierung, ein Array mit mehreren Werten zu befüllen, z.B.:

    Dim $Farm [5][4]= [["Anton","Berta","Cebulon","Dummy"],[""]]

    Wie funktioniert das, ohne dass ich den Dim-Befehl setze?
    Das heißt, ich dimensioniere $Farm [5][4], und befülle anschließend gezielt das Array.

    Lasst mal das folgende Skript laufen:

    Spoiler anzeigen

    #include <Array.au3>

    Dim $Farm [5][4]= [["Anton","Berta","Cebulon","Dummy"],[""]]
    _ArrayDisplay( $Farm, "2D-Array" )
    Dim $Farm [5][4]= [[""],["Becks","Jever","Veltins","Warsteiner"]]
    _ArrayDisplay( $Farm, "2D-Array" )
    Dim $Farm [5][4]= [[""],[""],["2D","Arrays","sind","schwierig,"]]
    _ArrayDisplay( $Farm, "2D-Array" )
    Dim $Farm [5][4]= [[""],[""],[""],["weil","ganz","schön","komplex!"]]
    _ArrayDisplay( $Farm, "2D-Array" )
    Dim $Farm [5][4]= [[""],[""],[""],[""],["Wie","setze","ich","Werte?"]]
    _ArrayDisplay( $Farm, "2D-Array" )


    Das zeigt, wie ich an die einzelnen "Dimansionen", d.h. Zeilen komme.
    Ich möchte aber, dass alle relevanten Werte, wie sie in den Codezeilen auftauchen,
    direkt in das 2D-Array geschrieben werden! Also nicht (wie beim Dimensionieren) nur jeweils die zuletzt eingegebene.

    Ich such jetzt schon so lange nach einer "Syntax-Error-freien" Lösung, leider ohne Erfolg.
    Kann jemand helfen?!!?

    -Rasta-

  • @Mega
    Danke, das macht genau das, was ich im Endergebnis brauche.

    Allerdings hat das für mich einen kleinen "Schönheitsfehler":
    Mein Array hat später etwa 15 Zeilen bei 8 Spalten (oder mehr), und die Texte sind z.T. nicht ganz so kurz wie im Beispiel.
    Da die Einträge alle die gleiche Struktur beschreiben, hätte ich sie gerne separat unter einander geschrieben im Sourcecode stehen,
    damit ich die einzelnen Array-Zeilen erst einmal (ohne kilometerweit nach rechts scrollen zu müssen) vernünftig einsehen
    und dann bei Bedarf auch einfach und "fehler-reduziert" ergänzen kann. :|

    Kann ich also das Befüllen des Arrays befehlsmäßig auch irgendwie splitten?
    So dass jede Zeile quasi über eine eigene Anweisung befüllt wird!?
    Das würde der Übersichtlichkeit und späteren Wartbarkeit doch erheblich gut tun... :rolleyes:

    Wäre toll, wenn Du dafür noch nen Tipp hättest! :thumbup:
    Danke schonmal!
    - Rasta -

  • BugFix
    Super - Das ist die Lösung für die Übersichtlichkeit!
    Sowas mit dem Unterstrich am Ende der Zeile hatte ich versucht, aber dass man die Zeile nach der ersten eckigen Klammer setzen muss ...
    dazu hat's bei mir nicht gereicht... :wacko:

    funkey
    Deine Lösung hatte ich auch probiert.
    Allerdings bräuchte ich dann 15 Zei x 8 Sp = 120 Codezeilen allein für das Befüllen meines späteren Arrays => eindeutig zu viel... :D

    @All
    Trotzdem interessiert es mich weiterhin, ob ich ein Array per separater Anweisung "zeilenweise" und mit mehreren Elementen auf einmal befüllen kann?!?
    Also nicht in einer einzigen Anweisung mit Zeilenumbruchfunktion.
    Geht sowas irgendwie?

    - Rasta -

    • Offizieller Beitrag

    Also mehrere Arrayelemente auf einmal lassen sich nur im Deklarationsschritt befüllen. (Also nur wenn Global, Local oder Dim auftauchen)
    Im Skript selber läßt sich immer nur 1 Element ansprechen.
    Du kannst aber mit einer kleinen Schleife alle entsprechenden Elemente einer Zeile nacheinander ansprechen.
    z.B. willst du in einem Array mit 4 Spalten die 3.te Zeile befüllen:

    [autoit]

    ; Werte die eingefügt werden sollen
    Local $arEinfueg[4] = [1,2,3,4]
    ; jetzt im eigentlichen Array eintragen in Zeile 3
    For $i = 0 To UBound($HauptArray, 2) -1
    $HauptArray[2][$i] = $arEinfueg[$i]
    Next

    [/autoit]