Array Rückgabewert

  • Ich habe gerade ein Problem mit der Rückgabe eines Arrays aus einer Funktion. Irgendwie tritt kein Fehler auf, aber wenn ich versuche nach der Funktion ein _ArrayDisplay() aufzurufen, passiert nichts.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Func _kgv($a, $b)
    Return ($a * $b) / _ggt($a, $b)
    EndFunc ;==>_kgv

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

    Func _ggt($a, $b)
    If $b = 0 Then Return $a
    Return _ggt($b, Mod($a, $b))
    EndFunc ;==>_ggt

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

    Func _all($n)
    Local $a[1]
    Local $y = 0

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

    If Mod(UBound($n), 2) <> 0 Then _ArrayAdd($n, 1)

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

    For $x = 0 To UBound($n) - 1 Step 2

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

    If $x = 0 Then
    $a[0] = _kgv($n[$x], $n[$x + 1])
    Else
    _ArrayAdd($a, _kgv($n[$x], $n[$x + 1]))
    EndIf

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

    $y += 1
    Next

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

    If UBound($a) = 1 Then
    _ArrayDisplay($a)
    Return $a
    EndIf
    _all($a)
    EndFunc ;==>_all

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

    Global $f[5] = [3, 2, 2, 5, 13]
    $store = _all($f)
    _ArrayDisplay($store)

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

    Bin für jede Hilfe und gute Erklärung dankbar.

    Einmal editiert, zuletzt von N0THING (12. April 2012 um 21:35)

    • Offizieller Beitrag

    Also dein Script gibt bei mir ein Array mit 1 Element zurück. Wert ist 390

  • Exakt, aber einmal rufe ich _ArrayDisplay in der Funktion auf (was auch funktioniert) und einmal rufe ich es danach auf, was aber leider nicht funktioniert. Es müssten also 2 _ArrayDisplays aufgerufen werden.

    • Offizieller Beitrag

    Das kommt von rekursiven Aufruf von _all, dieser gibt immer der vorigen Instanz den Returnwert.

  • Sowas hatte ich mir schon gedacht. Rekursionen sind völliges Neuland für mich. Wie löst man diese Situation am besten? Ich möchte einfach nur das die Funktion mir einen Wert zurückgibt. Da ich hier das KGV berechne, ist es eine einzelne Zahl und es ist ziemlich egal ob die Rückgabe als Array oder schlicht als Variable erfolgt.

    Global $N [2] = [5,10]
    MsgBox(0,"",_All($N))

    Würde dann 10 als Rückgabe liefern.
    Wie mach ich das?

  • _all ist rekursiv.

    $store bekommt den Rückgabewert vom letzten _all-Aufruf.
    Dieser endet mit _all($a). Dies wird noch ausgeführt, die äußerste _all bekommt auch einen Rückgabewert aber reicht ihn nicht als ihren Rückgabewert weiter.
    Es gibt also schlussendlich keinen Rückgabewert von _all weswegen $store leer ist und ArrayDisplay daher nichts anzeigt (mal die @error-Makros von _ArrayDisplay anschauen).

    Um das zu lösen musst du einfach nur dafür sorgen das die letze _all auch in einem Fall Ubound($a) != 1 einen Rückgabewert schmeißt.
    Am einfachsten also _all($a) mit Return _all($a) ersetzen.

  • Vielen, viele Dank!

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Func _kgv($a, $b)
    Return ($a * $b) / _ggt($a, $b)
    EndFunc ;==>_kgv

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

    Func _ggt($a, $b)
    If $b = 0 Then Return $a
    Return _ggt($b, Mod($a, $b))
    EndFunc ;==>_ggt

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

    Func _all($n)
    Local $a[1]
    Local $y = 0

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

    If Mod(UBound($n), 2) <> 0 Then _ArrayAdd($n, 1)

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

    For $x = 0 To UBound($n) - 1 Step 2

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

    If $x = 0 Then
    $a[0] = _kgv($n[$x], $n[$x + 1])
    Else
    _ArrayAdd($a, _kgv($n[$x], $n[$x + 1]))
    EndIf

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

    $y += 1
    Next

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

    If UBound($a) = 1 Then
    Return $a [0]
    EndIf
    Return _all($a)
    EndFunc ;==>_all

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

    Global $f[2] = [5,10]
    MsgBox(0,"",_All($f))

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