Array-Funktionen mittels Variable ansprechen?!

01/18/2015 03:28 dacto#1
Hallo Zusammen,

ich bin Neuling und taste mich langsam voran. Habe ein paar Zeilen Code gebastelt und hoffe jetzt auf eure Hilfe. Folgendes:

Ich habe verschiedene 1D Arrays [je gleich dimensoniert]. Mein Ziel ist es jeden der Arrays mit einer Funktion zu bearbeiten, ohne dabei diese Funktion für jeden Array in den Code schreiben zu müssen. Die Arrays sollen der Funktion vielmehr mittels Schleife unterworfen werden.

Zur Veranschaulichung:

$arrayG_1 [100]
$arrayG_2 [100]
$arrayG_3 [100]
$arrayG_4 [100]
...
$arrayG_n

Unterschiede im Namen gibt es also nur durch die Ziffer am Ende. Meine Idee ist es, den jeweiligen Array in der Schleife durch den Namensstamm + der jeweiligen Ziffer anzugeben, welche dann mittels Schleife durchlaufen wird. Das könnte mE (wenn dieser Weg irgendwie gangbar ist) so aussehen:

"$arrayG_"&$Ziffer

Das ganze an einer beliebigen Funktion dargestellt, hier zB mit UBound

For $Ziffer= 1 to $anzahlArrays
UBound("$arrayG_"&$Ziffer)
Next

Funktioniert nur leider nicht :mad: !!
Den Code habe ich nicht hochgeladen, weil es mir nicht um meine spezielle Anwendung geht, sondern darum ob/wie sowas grds. machbar ist. Wenn nötig folgt der Code aber natürlich :)

Ich hoffe ihr könnt mir irgendwie helfen, ich bin schon am verzweifeln. Beste Grüße!
dacto
01/18/2015 03:37 alpines#2
Natürlich geht das nicht. Du könntest das entweder mit Assign / Execute umformulieren aber das ist schlampig und schlecht.

Stattdessen kannst du einfach 2D-Arrays nehmen und die erste Dimension als 1..2..3..n iterieren.
01/18/2015 11:54 lolkop#3
Abgesehen von der von Alpines vorgeschlagenen Möglichkeit, gibt es noch eine zweite Möglichkeit. Du könntest auch ein weiteres 1D Array anlegen, welches alle anderen Arrays enthält...

Beide Möglichkeiten haben ihre Vor- und Nachteile. Ein Array welches andere Arrays enthält wird von Autoit zwar weniger effizient gehandhabt, kann aber im Gegensatz zu mehrdimensionalen Arrays auch mit einer For - In Schleife durchlaufen werden (komfortabler)...

Code:
; Möglichkeit 1
Dim $array[4][100]
For $y=0 To UBound($array,1)-1
	For $x=0 To UBound($array,2)-1
		; Aktion mit $array[$y][$x]
	Next
Next

; Möglichkeit 2
Dim $array1[100], $array2[100], $array3[100], $array4[100], $arrays[4] = [$array1, $array2, $array3, $array4]
For $array In $arrays
	For $element in $array
		; Aktion mit $element
	Next
Next
Wenn man nicht unbedingt auf die Indizes angewiesen ist, kann es durchaus Sinn machen, Möglichkeit zwei zu nutzen.

Ein dritter Weg wäre die Nutzung der Eval Funktion. Dieser ist aber in jedem Falle der ineffizienteste und unsauberste Weg, da potentielle Fehler erst während der Laufzeit auftreten (Hier nur der Vollständigkeithalber mit aufgenommen):
Code:
; Möglichkeit 3
Dim $array1[100], $array2[100], $array3[100], $array4[100]
For $i=1 To 4
	$array = Eval("array" & $i)
	For $x=0 To UBound($array)-1
		; Aktion mit $array[$x]
	Next
Next
01/19/2015 03:07 dacto#4
Hey, vielen Dank an euch beide. Ich versuche mal eure Lösungen in meinem Code umzusetzen und berichte dann. Bzw. frage weiter :-)
..dauert wahrscheinlich ein wenig...
Top auf jeden Fall, danke nochmal!!

Update: hat super geklappt. Ich habs mit Variante 1 umgesetzt. Merci :-)!!