Mehrdimensionales Array mit Return übergeben

  • Hallo Gemeinde,

    habe ein Problem und bekomme es nicht gelöst.

    Ich habe ein Funktion die mir beim Aufruf drei Lokale Arrays mit Daten befüllt. Mit einem Übergabeparameter in die Funktion wähle ich aus welches dieser drei Arrays mit Return zurückgegeben wird.
    Benötigen tue ich immer alle drei Array Inhalte, das heißt ich rufe aktuell die Funktion 3 mal hintereinander auf weil ich nicht weiß wie ich mit Return alle drei Arrays übergeben kann.

    [autoit]


    So das Aktuelle Prinzip:

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

    $test1 = _beispiel(1)
    $test2 = _beispiel(2)
    $test3 = _beispiel(3)

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

    Func beispiel($x)

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

    if $x = 1 then return $a
    if $x = 2 then return $b
    if $x = 3 then return $c

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

    EndFunc

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

    So hätte ich es gerne:

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

    $test1 = _beispiel()

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

    Func beispiel()

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

    return $a[][]
    EndFunc

    [/autoit]

    Würde mich freuen wenn Ihr mir Tipps geben könntet wie ich die drei arrays am besten in ein Return rein packe. Evt mit nem 2D Array...

    LG Tim

  • AutoIt hat leider keine Arraycast methode.
    Allerdings kann man sich die basteln:

    [autoit]


    Global $aTest = _beispiel()
    $aTest[0] ; = $a
    $aTest[1] ; = $b
    $aTest[2] ; = $c

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

    Func _beispiel()
    Local Static $a[3], $b[3], $c[3]
    Return Array($a, $b, $c)
    EndFunc

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

    Func Array($x1, $x2 = 0, $x3 = 0, $x4 = 0, $x5 = 0, $x6 = 0, $x7 = 0, $x8 = 0)
    Local $aRet[8] = [$x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8]
    ReDim $aRet[@NumParams]
    Return $aRet
    EndFunc

    [/autoit]
  • Hi,
    Arrays können auch Arrays beinhalten!

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    ;So das Aktuelle Prinzip:

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

    Dim $a= [0, 11], $b = [0, 22], $c = [0, 33] ;arrays vorbelegen

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

    $test = beispiel(1)
    _ArrayDisplay($test)
    $test = beispiel(2)
    _ArrayDisplay($test)
    $test = beispiel(3)
    _ArrayDisplay($test)

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

    Func beispiel($x)
    If $x = 1 Then Return $a
    If $x = 2 Then Return $b
    If $x = 3 Then Return $c
    EndFunc ;==>beispiel

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

    ;so soll es sein
    msgbox(0,0,"so soll es sein")
    dim $z[3], $a= [0, 11], $b = [0, 22], $c = [0, 33] ;arrays vorbelegen

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

    $test = _beispiel()
    _ArrayDisplay($test[0])
    _ArrayDisplay($test[1])
    _ArrayDisplay($test[2])

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

    Func _beispiel()
    ;array im Array
    $z[0] = $a
    $z[1] = $b
    $z[2] = $c
    Return $z
    EndFunc ;==>_beispiel

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    Ich habe ein Funktion die mir beim Aufruf drei Lokale Arrays mit Daten befüllt.

    Da meinst du wohl eher Globale Arrays ;)

    Mit einem Übergabeparameter in die Funktion wähle ich aus welches dieser drei Arrays mit Return zurückgegeben wird.
    Benötigen tue ich immer alle drei Array Inhalte, das heißt ich rufe aktuell die Funktion 3 mal hintereinander auf weil ich nicht weiß wie ich mit Return alle drei Arrays übergeben kann.


    Wenn du sowieso alle 3 Array als Return brauchst, diese immer in der Funktion befüllt werden, würde ich diese, wie bereits vorgeschlagen auch nur als lokale statische Array in der Funktion führen. Mit einem Unterschied: Nicht 3 Array zurückgeben, sondern die Funktion so gestalten, dass sie einen Füllparameter bekommt und einen Returnparameter. Letztlich bleibt die Summe des Aufwandes aber gleich, da die zurückgegebenen Array wieder selektiert werden müssen oder halt 3 Aufrufe erfolgen um diese einzeln zu erhalten.

    Spoiler anzeigen
    [autoit]


    $arA = _MyArray(0, 1) ; füllt alle 3 Arrays und gibt das erste zurück
    $arB = _MyArray(1) ; gibt das zweite Array zurück
    $arC = _MyArray(2) ; gibt das dritte Array zurück

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

    Func _MyArray($retNum, $fill=0)
    Local Static $arData[3]
    Local $arTmp
    If $fill = 1 Then
    For $i = 0 To 2
    $arTmp = $arData[$i]
    ; Code zum Befüllen der Arrays
    $arData[$i] = $arTmp
    Next
    EndIf
    Return $arData[$retNum]
    EndFunc

    [/autoit]

    Aber wenn es hier um große Arrays geht, ist der Hinweis auf ByRef die optimale Lösung.