Aus 3 1D-Arrays ein Array mit 3 Spalten erzeugen

  • Hallo,

    ich habe aus einer Funktion ein 1D Array zurückbekommen. Und dies 3 mal.

    $Array1[1000]
    $Array2[1000]
    $Array3[1000]

    Nun würde ich gerne ein Array erzeugen, welches 1000 Zeilen und 3 Spalten hat.
    Hintergrund: Ich möchte dann das ganze neue Array nach Spalte 2 sortieren (die Einträge 1 und 3 sollen also ebenso umsortiert werden)

    Irgendwie stehe ich auf dem Schlauch...

    Lieben Dank.

  • Hi @dost0011

    Array4 beinhaltet nach der Schleife die Inhalte von den anderen 3 Arrays.

    AutoIt
    Local $Array1[1000]
    Local $Array2[1000]
    Local $Array3[1000]
    Local $Array4[1000][3]
    For $i = 0 To 999 ; Wenn wirklich dieser Wert in allen Arrays gleich ist!
    	$Array4[$i][0] = $Array1[$i]
    	$Array4[$i][1] = $Array2[$i]
    	$Array4[$i][2] = $Array3[$i]
    Next


    Das klappt so nur, wenn die wirklich alle gleich groß sind. Sonst stürzt dieser plumpe Ansatz ab ;)

    Grüße autoiter

  • Für beliebige Arrays. (Hab die Funktion aber nicht getestet, also am besten selbst nochmal drüberschauen)

    M

  • Hab die Funktion aber nicht getestet

    Ich aber... wie zu erwarten - sie funktioniert. ;)

    Func Foo($a, $b, $c, $d, $e)
    Für wirklich große Arrays ist das so allerdings keine gute Lösung...

    da wäre es angebracht den Parametern das Schlüsselwort ByRef voranzustellen.
    Func Foo(ByRef $a, ByRef $b, ByRef $c, ByRef $d, ByRef $e)

    Warum?

    Hier ein Auszug aus der deutschen Hilfe:
    Das Schlüsselwort ByRef zeigt an, dass der Parameter als Referenz zu dem Originalobjekt behandelt werden soll. Standardmäßig wird der Parameter in eine neue Variable kopiert. Jedoch verknüpft ByRef die neue Varaible auf den Originalparameter. ByRef ist zu bevorzugen wenn eine Funktion große Mengen an Daten beinhaltet, wie zum Beispiel ein großen Array. Wird dies nicht getan, so erweist das kopieren aller Daten als Bremsklotz.

    Wird das Schlüsselwort ByRef angegeben, sind diese Parameter allerdings nicht mehr optional und sie müssen zudem auch als Variable übergeben werden, welche in dem Fall ja als Referenz verwendet werden.

    Mit etwas Tricky kann man diesen Umstand aber umgehen und die Vorteile von ByRef nutzen, indem wir (an beliebiger Stelle) einfach Dummy-Variablen verwenden, um so die geforderte Anzahl an Parametern für unsere Funktion zu liefern.

    Foo

    2 Mal editiert, zuletzt von Bitnugger (22. November 2016 um 05:53)

  • Sorry, ich habe die Funktion überhaupt nicht verstanden. Das Ergebnis gefällt mir auch nicht.
    Ich will mich keineswegs mit Mars messen, der sein Konstrukt ja sogar blind geschrieben hat, aber ich würde es eher so machen:

    Spoiler anzeigen

    Grüße autoiter

  • Sorry, aber das ist keine gute Lösung, denn...

    1.) ...damit kopierst du die Arrays ja zwei Mal: zuerst nach $aArray4, dann nach $ArrayResult - und ignorierst damit zu 100% was ich bezüglich "ByRef" geschrieben habe.
    2.) ...sie ist nicht als Funktion mit variabler Anzahl an Parametern ausgelegt.

    Das Ergebnis gefällt mir auch nicht.

    Das Ergebnis ist ja auch speziell auf die Anfrage von @dost0011 ausgerichtet.