Dynamische Variablennamen

  • Hallo zusammen

    Ich habe leider keinen besseren Titel gefunden :(

    Ich habe zwei verschiedene Arrays. Einmal $as_List1 und einmal $as_List2.
    Diese Arrays werden in einer Funktion befüllt. Nun möchte ich für beide Arrays die gleiche Funktion verwenden und per Parameter übergeben, welches Array befüllt werden soll.

    Also

    [autoit]


    Func _Fill_Lists($iListNumber)
    For $i = 1 To 100
    $as_List {$iListNumber} [$i][0] = "Test"
    Next
    EndFunc ;==>_Fill_Lists

    [/autoit]

    Die richtige Funktion ist natürlich einiges umfangreicher. Aber wie kann ich dafür sorgen, dass ich mit einer Funktion und einem Übergabeparameter das richtige Array befüllen kann?
    Klar, ich könnte eine Hilfsfunktion machen, in welcher ich das korrekte Array übergebe (mit ByRef).
    Aber gibt es eine einfachere und elegantere Lösung?

    Gruss
    Veronesi

    Einmal editiert, zuletzt von veronesi (24. Juni 2012 um 11:26)

  • Hi,
    schau dir mal

    [autoit]


    EVAL

    [/autoit]

    an...

    Spoiler anzeigen
    [autoit]

    #include"array.au3"

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

    dim $a1[3]=[1,1,1]
    dim $a2[3]=[2,2,2]

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

    _test(1)
    _test(2)

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

    func _test($n)
    $e=eval("a"&$n)
    _arraydisplay($e)
    endfunc

    [/autoit]
  • wenn es nur Variablen wären (keine Arrays)

    [autoit]

    Assign

    [/autoit]


    Bei Arrays ist das blöd.

    Was ist an ByRef so schlecht ??

    [autoit]

    Func _Fill_Lists(ByRef $aFuellen)
    For $i = 1 To 100
    $aFuellen [$i][0] = "Test"
    Next
    EndFunc ;==>_Fill_Lists

    [/autoit]

    Andy: Er will es ja befüllen, nicht auslesen.und so müsste er $e danach wieder ins richtige Array kopieren.
    da geht doch das mit ByRef schneller, oder ?

  • Ja, Assign funktioniert nicht so recht mit arrays......
    Leider

    Mit ByRef klappt das zwar schon, aber ich habe in meinem Programm schlussendlich 23 verschiedene Arrays. Da wird es etwas unübersichtlich, weil ich dann ja auch 23 Hilfsfunktionen brauche, welche jeweils das korrekte Array übergeben.....

    Eval und Assign wären genau das, was sich brauche. Aber ich hab's noch nicht hingekriegt, dass ich mit Assign das komplette Array überschreiben kann!

    Edit:
    Und in der Hilfe steht noch schön, dass es kein Array sein kann. Mist!

  • Also bei mir funktioniert das einwandfrei!

    Spoiler anzeigen
    [autoit]

    #include"array.au3"

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

    dim $a1[3]=[1,1,1]
    dim $a2[3]=[2,2,2]

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

    _test(1)
    _test(2)

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

    func _test($n)
    $e=eval("a"&$n)
    $e[1]="55"
    _arraydisplay($e)
    endfunc

    [/autoit]
  • Moin,

    Auch wenn ich persönlich Execute überhaupt nicht mag, ich glaube das ist genau das was du brauchst.

    [autoit]


    #include <Array.au3>

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

    Global $Array1[101][1], $Array2[101][1], $Array3[101][1], $Array4[101][1], $Array5[101][1]

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

    _ArrayDisplay($Array1)
    _ArrayDisplay($Array2)
    _ArrayDisplay($Array3)
    _ArrayDisplay($Array4)
    _ArrayDisplay($Array5)

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

    _Fill_All_Lists(3)

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

    _ArrayDisplay($Array1)
    _ArrayDisplay($Array2)
    _ArrayDisplay($Array3)
    _ArrayDisplay($Array4)
    _ArrayDisplay($Array5)

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

    Func _Fill_All_Lists($n)
    For $i = 1 To $n Step 1
    Execute('_Fill_Lists($Array'&$i&')')
    Next
    EndFunc

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

    Func _Fill_Lists(ByRef $a)
    For $i = 1 To 100
    $a[$i][0] = 'Test'
    Next
    EndFunc

    [/autoit]
  • hab es nicht probiert, aber :

    [autoit]

    Func _Fill_Lists($iListNumber)
    For $i = 1 To 100
    Execute("$as_List"&$iListNumer&"[$i][0]=""Test""")
    Next
    EndFunc

    [/autoit]
  • Andy
    Ich meinte es etwas anders:

    [autoit]

    #include"array.au3"

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

    dim $a1[3]=[1,1,1]
    dim $a2[3]=[2,2,2]

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

    _test(1)
    _arraydisplay($a1)
    _test(2)
    _arraydisplay($a2)

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

    func _test($n)
    $e=eval("a"&$n)
    $e[0]="11"
    $e[1]="22"
    Assign("a" & $n, $e)
    endfunc

    [/autoit]

    Das scheint zwar zu funktionieren, aber das Array wird nur "teilweise" überschrieben.
    Das heisst, in der Funktion _test werden nur die Indizes 0 und 1 geschrieben. Trotzdem ist der Index 2 danach noch vorhanden.
    Den möchte ich auch weg haben.
    Einfach das Array komplett mit dem Inhalt von $e ersetzen.

    Gruss, Veronesi

  • So?

    Spoiler anzeigen
    [autoit]

    #include"array.au3"

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

    dim $a1[3]=[1,1,1]
    dim $a2[3]=[2,2,2]

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

    $a1=_test(1)
    _arraydisplay($a1)
    $a2=_test(2)
    _arraydisplay($a2)

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

    func _test($n)
    $e=eval("a"&$n)
    $e[1]="55"
    return $e
    ;_arraydisplay($e)
    endfunc

    [/autoit]
  • aha, ich glaube ich habs begriffen^^
    mom....dauert etwas...

  • hmm schade
    Theoretisch müsste das mit Execute ja gehen
    Probier dann mal so :

    [autoit]

    Func _Fill_Lists($iListNumber)
    $e= Eval("$as_List"&$iListNumber)
    For $i = 1 To 100
    $e[$i][0] = "Test"
    Next
    Execute ("$as_List"&$iListNumber&"=$e")
    EndFunc

    [/autoit]

    Wenn das net geht, ich weis vllt noch was, aber hab grad keine Zeit mehr

  • Spoiler anzeigen
    [autoit]

    #include-once
    #include<string.au3>
    #include<array.au3>

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

    #region _Execute-Fuction by Shadow992 (http://www.elitepvpers.de)
    Global $error_execute = 0

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

    Func _Execute($string_execute)

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

    $string_execute = $string_execute & @CRLF
    $string_execute = StringReplace($string_execute, "@error", "$error_execute", 0, 2)
    Local $temp211_execute = ""
    Local $temp2_execute = ""
    Local $temp_execute = ""
    Local $number_execute = 0
    Local $number2_execute = 0
    Local $ifs_found_execute = 0
    Local $while_founds_execute = 0
    Local $new_comands_execute = ""
    Local $var_execute = _StringExplode($string_execute, @CRLF)
    Local $i_execute = 0
    Local $found_execute, $else_found_execute, $while_found_execute, $exit_loop = 0

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

    Dim $var2_execute[UBound($var_execute)]
    Local $ua_execute = 0
    While $ua_execute < UBound($var_execute)
    If StringLeft($var_execute[$ua_execute], 1) = " " Then
    Do
    $var_execute[$ua_execute] = StringTrimLeft($var_execute[$ua_execute], 1)
    Until StringLeft($var_execute[$ua_execute], 1) <> " "
    EndIf

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

    $var2_execute[$ua_execute] = StringStripWS($var_execute[$ua_execute], 8)
    $ua_execute += 1
    WEnd
    While $i_execute < UBound($var_execute)
    ;~ MsgBox(0, "", $var2_execute[$i_execute])
    If StringInStr($var2_execute[$i_execute], ";") <> 1 Then
    If StringInStr($var2_execute[$i_execute], "exit", 2) = 1 Then
    if (StringLen($var2_execute[$i_execute]) = 4) Then
    Exit
    ElseIf StringLen($var2_execute[$i_execute]) = 8 And StringInStr($var2_execute[$i_execute], "exitloop", 2) = 1 Then
    $exit_loop = 1
    EndIf
    ElseIf StringInStr($var2_execute[$i_execute], "if", 2) = 1 Then
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)if (.*<>.*)|(.*=.*)|(.*<.*)|(.*>.*)|(.*>=.*)|(.*<=.*)|(.*==.*)then", 3)
    ;~ _ArrayDisplay($found_execute)
    If IsArray($found_execute) Then
    $number_execute = 0
    if (StringLen($found_execute[0]) > 3) Then
    $found_execute[0] = StringReplace($found_execute[0], "then", "", 0, 0)
    $temp2_execute = Execute($found_execute[0])
    $error_execute = @error
    $number_execute = 0
    Else
    For $ia_execute = 0 To UBound($found_execute)-1
    if (StringLen($found_execute[$ia_execute]) > 3) Then
    For $aa_execute = 0 To StringInStr($found_execute[$ia_execute], "if", 0)
    $found_execute[$ia_execute] = StringTrimLeft($found_execute[$ia_execute], 1)
    Next
    $found_execute[$ia_execute] = StringReplace($found_execute[$ia_execute], "then", "", 0, 0)
    ;~ Msgbox(0,"test2",$found_execute[1])
    $temp2_execute = Execute($found_execute[$ia_execute])
    $error_execute = @error
    $number_execute = $ia_execute
    EndIf
    Next
    ;~ Msgbox(0,"test1",$found_execute[1])

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

    EndIf

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

    If $temp2_execute <> "True" Then
    $ifs_found_execute = 1
    $else_found_execute = 0
    For $a_execute = $i_execute + 1 To UBound($var2_execute) - 1
    If StringInStr($var2_execute[$a_execute], "if", 2) = 1 Then $ifs_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "endif", 2) = 1 Then $ifs_found_execute -= 1
    If StringInStr($var2_execute[$a_execute], "else", 2) = 1 And $ifs_found_execute = 1 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    If $ifs_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $i_execute = $number_execute
    Else
    $else_found_execute = 0
    $ifs_found_execute = 1
    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "if", 2) = 1 Then $ifs_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "endif", 2) = 1 Then $ifs_found_execute -= 1
    If StringInStr($var2_execute[$a_execute], "else", 2) = 1 And $ifs_found_execute = 1 Then
    $number2_execute = $a_execute
    $else_found_execute = 1
    EndIf
    If $ifs_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    If $else_found_execute = 1 Then
    $new_comands_execute = ""
    For $ai_execute = $i_execute + 1 To $number2_execute - 1
    $new_comands_execute &= $var_execute[$ai_execute] & @CRLF
    Next
    _Execute($new_comands_execute)
    $i_execute = $number_execute
    EndIf
    EndIf
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    ElseIf StringInStr($var2_execute[$i_execute], "while", 2) = 1 Then
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)while (.*=.*)|(.*<.*)|(.*>.*)|(.*>=.*)|(.*<=.*)|(.*<>.*)", 3)
    If IsArray($found_execute) Then
    $number_execute = 0
    $while_found_execute = 1
    For $o_execute = 0 To UBound($found_execute) - 1
    if (StringInStr($found_execute[$o_execute], "while", 2) = 1) Then
    $number2_execute = $o_execute
    ExitLoop
    EndIf
    Next
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error
    If $temp2_execute = "True" Then
    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "while", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "wend", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $new_comands_execute = ""
    For $u_execute = $i_execute + 1 To $number_execute - 1
    $new_comands_execute &= $var_execute[$u_execute] & @CRLF
    Next
    While $temp2_execute = "True"
    _Execute($new_comands_execute)
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error
    If $exit_loop = 1 Then
    $exit_loop = 0
    ExitLoop
    EndIf
    WEnd
    $i_execute = $number_execute
    Else
    $while_found_execute = 1
    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "while", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "wend", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $i_execute = $a_execute
    ExitLoop
    EndIf
    Next
    EndIf
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    ElseIf StringInStr($var2_execute[$i_execute], "for", 2) = 1 Then
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)for (\x24\w*\x20*)=(\x20*\d*\x20*)to(\x20*\d*\x20*)step(\x20*\d*\x20*)", 3)
    _ArrayDisplay($found_execute)
    If IsArray($found_execute) Then
    $number_execute = 0
    $while_found_execute = 1
    $found_execute[0] = StringTrimLeft($found_execute[0], 1)
    Assign($found_execute[0], $found_execute[1], 2)
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error

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

    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "for", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "next", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $new_comands_execute = ""
    For $u_execute = $i_execute + 1 To $number_execute - 1
    $new_comands_execute &= $var_execute[$u_execute] & @CRLF
    Next
    Do
    _Execute($new_comands_execute)
    $error_execute = @error
    If $exit_loop = 1 Then
    $exit_loop = 0
    ExitLoop
    EndIf

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

    Assign($found_execute[0], Eval($found_execute[0]) + Execute($found_execute[3]), 2)
    Until Eval($found_execute[0]) >= Execute($found_execute[2])
    $i_execute = $number_execute
    Else
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)for (\x24\w*\x20*)=(\x20*\d*\x20*)to(\x20*\d*\x20*)", 3)
    _ArrayDisplay($found_execute)
    If IsArray($found_execute) Then
    $number_execute = 0
    $while_found_execute = 1
    $found_execute[0] = StringTrimLeft($found_execute[0], 1)
    Assign($found_execute[0], $found_execute[1], 2)
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error

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

    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "for", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "next", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $new_comands_execute = ""
    For $u_execute = $i_execute + 1 To $number_execute - 1
    $new_comands_execute &= $var_execute[$u_execute] & @CRLF
    Next
    Do
    _Execute($new_comands_execute)
    $error_execute = @error
    If $exit_loop = 1 Then
    $exit_loop = 0
    ExitLoop
    EndIf
    Assign($found_execute[0], Eval($found_execute[0]) + 1)
    Until Eval($found_execute[0]) >= Execute($found_execute[2])
    $i_execute = $number_execute
    EndIf
    EndIf
    Else
    If StringInStr($var2_execute[$i_execute], "$") = 1 Then
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*)=", "")
    $temp211_execute = Execute($var_execute[$i_execute])
    $error_execute = @error
    Assign(StringTrimLeft($temp_execute[0], 1), $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2b)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2b)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 2)
    $temp211_execute = Execute($var_execute[$i_execute]) + Eval($temp_execute[0])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2d)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2d)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) - Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x26)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x26)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) & Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2f)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2f)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) / Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2a)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2a)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) * Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x5e)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x5e)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) ^ Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    EndIf
    EndIf
    $i_execute += 1

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

    WEnd
    EndFunc ;==>_Execute
    #endregion _Execute-Fuction by Shadow992 (http://www.elitepvpers.de)

    [/autoit]


    Hab mal eine erweiterte Execute-Funktion gepostet, die ich gefunden habe.
    probier meine Möglichkeiten (ich denke Post 8 sollte gehen) durch und nimm anstatt Execute _Execute

  • Leider Fehlanzeige!
    Das Skript funktioniert so nicht.
    Hier der verwendete Code:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <string.au3>
    #include <array.au3>

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

    Global $as_List1[101][2]

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

    _Fill_Lists(1)

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

    Func _Fill_Lists($iListNumber)
    For $i = 1 To 100
    _Execute("$as_List"&$iListNumber&"[$i][0]=""Test""")
    Next
    EndFunc

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

    _ArrayDisplay($as_List1)

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

    #region _Execute-Fuction by Shadow992 (http://www.elitepvpers.de)
    Global $error_execute = 0

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

    Func _Execute($string_execute)

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

    $string_execute = $string_execute & @CRLF
    $string_execute = StringReplace($string_execute, "@error", "$error_execute", 0, 2)
    Local $temp211_execute = ""
    Local $temp2_execute = ""
    Local $temp_execute = ""
    Local $number_execute = 0
    Local $number2_execute = 0
    Local $ifs_found_execute = 0
    Local $while_founds_execute = 0
    Local $new_comands_execute = ""
    Local $var_execute = _StringExplode($string_execute, @CRLF)
    Local $i_execute = 0
    Local $found_execute, $else_found_execute, $while_found_execute, $exit_loop = 0

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

    Dim $var2_execute[UBound($var_execute)]
    Local $ua_execute = 0
    While $ua_execute < UBound($var_execute)
    If StringLeft($var_execute[$ua_execute], 1) = " " Then
    Do
    $var_execute[$ua_execute] = StringTrimLeft($var_execute[$ua_execute], 1)
    Until StringLeft($var_execute[$ua_execute], 1) <> " "
    EndIf

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

    $var2_execute[$ua_execute] = StringStripWS($var_execute[$ua_execute], 8)
    $ua_execute += 1
    WEnd
    While $i_execute < UBound($var_execute)
    ;~ MsgBox(0, "", $var2_execute[$i_execute])
    If StringInStr($var2_execute[$i_execute], ";") <> 1 Then
    If StringInStr($var2_execute[$i_execute], "exit", 2) = 1 Then
    if (StringLen($var2_execute[$i_execute]) = 4) Then
    Exit
    ElseIf StringLen($var2_execute[$i_execute]) = 8 And StringInStr($var2_execute[$i_execute], "exitloop", 2) = 1 Then
    $exit_loop = 1
    EndIf
    ElseIf StringInStr($var2_execute[$i_execute], "if", 2) = 1 Then
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)if (.*<>.*)|(.*=.*)|(.*<.*)|(.*>.*)|(.*>=.*)|(.*<=.*)|(.*==.*)then", 3)
    ;~ _ArrayDisplay($found_execute)
    If IsArray($found_execute) Then
    $number_execute = 0
    if (StringLen($found_execute[0]) > 3) Then
    $found_execute[0] = StringReplace($found_execute[0], "then", "", 0, 0)
    $temp2_execute = Execute($found_execute[0])
    $error_execute = @error
    $number_execute = 0
    Else
    For $ia_execute = 0 To UBound($found_execute)-1
    if (StringLen($found_execute[$ia_execute]) > 3) Then
    For $aa_execute = 0 To StringInStr($found_execute[$ia_execute], "if", 0)
    $found_execute[$ia_execute] = StringTrimLeft($found_execute[$ia_execute], 1)
    Next
    $found_execute[$ia_execute] = StringReplace($found_execute[$ia_execute], "then", "", 0, 0)
    ;~ Msgbox(0,"test2",$found_execute[1])
    $temp2_execute = Execute($found_execute[$ia_execute])
    $error_execute = @error
    $number_execute = $ia_execute
    EndIf
    Next
    ;~ Msgbox(0,"test1",$found_execute[1])

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

    EndIf

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

    If $temp2_execute <> "True" Then
    $ifs_found_execute = 1
    $else_found_execute = 0
    For $a_execute = $i_execute + 1 To UBound($var2_execute) - 1
    If StringInStr($var2_execute[$a_execute], "if", 2) = 1 Then $ifs_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "endif", 2) = 1 Then $ifs_found_execute -= 1
    If StringInStr($var2_execute[$a_execute], "else", 2) = 1 And $ifs_found_execute = 1 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    If $ifs_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $i_execute = $number_execute
    Else
    $else_found_execute = 0
    $ifs_found_execute = 1
    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "if", 2) = 1 Then $ifs_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "endif", 2) = 1 Then $ifs_found_execute -= 1
    If StringInStr($var2_execute[$a_execute], "else", 2) = 1 And $ifs_found_execute = 1 Then
    $number2_execute = $a_execute
    $else_found_execute = 1
    EndIf
    If $ifs_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    If $else_found_execute = 1 Then
    $new_comands_execute = ""
    For $ai_execute = $i_execute + 1 To $number2_execute - 1
    $new_comands_execute &= $var_execute[$ai_execute] & @CRLF
    Next
    _Execute($new_comands_execute)
    $i_execute = $number_execute
    EndIf
    EndIf
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    ElseIf StringInStr($var2_execute[$i_execute], "while", 2) = 1 Then
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)while (.*=.*)|(.*<.*)|(.*>.*)|(.*>=.*)|(.*<=.*)|(.*<>.*)", 3)
    If IsArray($found_execute) Then
    $number_execute = 0
    $while_found_execute = 1
    For $o_execute = 0 To UBound($found_execute) - 1
    if (StringInStr($found_execute[$o_execute], "while", 2) = 1) Then
    $number2_execute = $o_execute
    ExitLoop
    EndIf
    Next
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error
    If $temp2_execute = "True" Then
    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "while", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "wend", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $new_comands_execute = ""
    For $u_execute = $i_execute + 1 To $number_execute - 1
    $new_comands_execute &= $var_execute[$u_execute] & @CRLF
    Next
    While $temp2_execute = "True"
    _Execute($new_comands_execute)
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error
    If $exit_loop = 1 Then
    $exit_loop = 0
    ExitLoop
    EndIf
    WEnd
    $i_execute = $number_execute
    Else
    $while_found_execute = 1
    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "while", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "wend", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $i_execute = $a_execute
    ExitLoop
    EndIf
    Next
    EndIf
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    ElseIf StringInStr($var2_execute[$i_execute], "for", 2) = 1 Then
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)for (\x24\w*\x20*)=(\x20*\d*\x20*)to(\x20*\d*\x20*)step(\x20*\d*\x20*)", 3)
    _ArrayDisplay($found_execute)
    If IsArray($found_execute) Then
    $number_execute = 0
    $while_found_execute = 1
    $found_execute[0] = StringTrimLeft($found_execute[0], 1)
    Assign($found_execute[0], $found_execute[1], 2)
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error

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

    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "for", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "next", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $new_comands_execute = ""
    For $u_execute = $i_execute + 1 To $number_execute - 1
    $new_comands_execute &= $var_execute[$u_execute] & @CRLF
    Next
    Do
    _Execute($new_comands_execute)
    $error_execute = @error
    If $exit_loop = 1 Then
    $exit_loop = 0
    ExitLoop
    EndIf

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

    Assign($found_execute[0], Eval($found_execute[0]) + Execute($found_execute[3]), 2)
    Until Eval($found_execute[0]) >= Execute($found_execute[2])
    $i_execute = $number_execute
    Else
    $found_execute = StringRegExp($var_execute[$i_execute], "(?i)for (\x24\w*\x20*)=(\x20*\d*\x20*)to(\x20*\d*\x20*)", 3)
    _ArrayDisplay($found_execute)
    If IsArray($found_execute) Then
    $number_execute = 0
    $while_found_execute = 1
    $found_execute[0] = StringTrimLeft($found_execute[0], 1)
    Assign($found_execute[0], $found_execute[1], 2)
    $temp2_execute = Execute($found_execute[$number2_execute])
    $error_execute = @error

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

    For $a_execute = $i_execute + 1 To UBound($var_execute) - 1
    If StringInStr($var2_execute[$a_execute], "for", 2) = 1 Then $while_found_execute += 1
    If StringInStr($var2_execute[$a_execute], "next", 2) = 1 Then $while_found_execute -= 1
    If $while_found_execute = 0 Then
    $number_execute = $a_execute
    ExitLoop
    EndIf
    Next
    $new_comands_execute = ""
    For $u_execute = $i_execute + 1 To $number_execute - 1
    $new_comands_execute &= $var_execute[$u_execute] & @CRLF
    Next
    Do
    _Execute($new_comands_execute)
    $error_execute = @error
    If $exit_loop = 1 Then
    $exit_loop = 0
    ExitLoop
    EndIf
    Assign($found_execute[0], Eval($found_execute[0]) + 1)
    Until Eval($found_execute[0]) >= Execute($found_execute[2])
    $i_execute = $number_execute
    EndIf
    EndIf
    Else
    If StringInStr($var2_execute[$i_execute], "$") = 1 Then
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*)=", "")
    $temp211_execute = Execute($var_execute[$i_execute])
    $error_execute = @error
    Assign(StringTrimLeft($temp_execute[0], 1), $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2b)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2b)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 2)
    $temp211_execute = Execute($var_execute[$i_execute]) + Eval($temp_execute[0])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2d)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2d)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) - Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x26)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x26)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) & Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2f)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2f)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) / Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x2a)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x2a)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) * Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    $temp_execute = StringRegExp($var2_execute[$i_execute], "(\x24\w*\x5e)=", 3)
    If IsArray($temp_execute) Then
    $var_execute[$i_execute] = StringRegExpReplace($var_execute[$i_execute], "(\x24\w*\x20*\x5e)=", "")
    $temp_execute[0] = StringTrimRight(StringTrimLeft($temp_execute[0], 1), 1)
    $temp211_execute = Eval($temp_execute[0]) ^ Execute($var_execute[$i_execute])
    Assign($temp_execute[0], $temp211_execute, 2)
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    Else
    Execute($var_execute[$i_execute])
    $error_execute = @error
    EndIf
    EndIf
    EndIf
    $i_execute += 1

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

    WEnd
    EndFunc ;==>_Execute
    #endregion _Execute-Fuction by Shadow992 (http://www.elitepvpers.de)

    [/autoit]
  • Ich denke man sollte hier weiter vorn anfangen zu überlegen.
    Was ist die Aufgabe?
    Was soll am Ende herauskommen?
    Ist es für die Lösung der Aufgabe wirklich notwendig 23 durchnummerierte Arrays zu verwenden?
    Kann man die Arrays selbst nicht wieder in andere Strukturen verpacken um den entsprechenden Zugriff durchzuführen (Array in Array oder ein Dictionary)?

    Beschreib also vielleicht erst einmal den Sinn des Unterfangens so dass man vielleicht von vornherein eine bessere Struktur verwenden kann anstatt sich mit so krummen Interpreter-eigenen Cheats wie Assign(), Eval() oder Execute() behelfen zu müssen.

    Auf die Lösung von Marsi per ByRef bist du gar nicht eingegangen - was stört dich daran?
    Du hast eine Funktion für alle Arrays. mit einem ReDim in der Funktion kannst du das Array auch entsprechend kürzen oder andere Sachen mit machen.

  • Ich weiß ja nicht, ob mein Code oben übersehen wurde, aber marginal abgeändert ergibt sich folgendes:

    [autoit]

    #include-once
    #include <string.au3>
    #include <array.au3>

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

    Global $as_List1[101][2]

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

    _Fill_Lists(1)

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

    Func _Fill_Lists($iListNumber)
    Execute('_Fill_List_By_Ref($as_List' & $iListNumber & ')')
    EndFunc ;==>_Fill_Lists

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

    Func _Fill_List_By_Ref(ByRef $aList)
    For $i = 1 To 100 Step 1
    $aList[$i][0] = 'Test'
    Next
    EndFunc ;==>_Fill_List_By_Ref

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

    _ArrayDisplay($as_List1)

    [/autoit]


    Edit:
    Diese riesige Execute Funktion ist hier unnütz.
    Die wurde nur entworfen um If Abfragen/Schleifen usw ausführen zu können.