Return ByRef?

  • Man kann Parameter ja ByRef übergeben (Func name ByRef $param) - ist es möglich, einen parameter byref zurück zugeben?

    sowas wie "return byref $result" ?

  • zb wenn ein array in einer function erstellt wird - ich erinner da mal an funktionen wie stringsplit....

  • [autoit]


    #Include <Array.au3>
    $string="string1|string2"
    Func _splitString($str)
    $stringSplitted=StringSplit($str, "|")
    Return $stringSplitted
    EndFunc
    $result=_splitString($string)
    _ArrayDisplay($result)

    [/autoit]
  • ja oliver, ist schon klar, du übergibst das ergebnis aber nicht byref sondern kopierst es.

    @autowert: dabei wird übergeben, wo ein wert im speicher steht, statt den eigentlichen wert zu übergeben.

  • ?(

    Spoiler anzeigen
    [autoit]

    Local $Test_ByRef = 4

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

    $Test = _Byref_Test($Test_ByRef)
    MsgBox(0, "ByRef", $Test_ByRef&@CRLF&$Test)

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

    Func _Byref_Test(ByRef $Variable)
    $Variable += 2
    Return $Variable
    EndFunc

    [/autoit]
  • das geht in autoit so direkt nicht... wenn du nicht kopieren willst, gib das entsprechende array "ByRef" mit und mach deine Änderungen in der funktion an dem referenzierten array ohne return

    • Offizieller Beitrag

    ist es möglich, einen parameter byref zurück zugeben?

    Zitat

    zb wenn ein array in einer function erstellt wird - ich erinner da mal an funktionen wie stringsplit....


    Dann deklariere einfach vorab den Ergebnisspeicher und übergib die Variable dazu beim Aufruf der Funktion mit ByRef:

    [autoit]

    #include <Array.au3>
    Local $ergebnisSplit
    If _mySplit('12345', '', $ergebnisSplit) Then _ArrayDisplay($ergebnisSplit)

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

    Func _mySplit($string, $trenner, ByRef $ergebnisSplit)
    $ergebnisSplit = StringSplit($string, $trenner, 2)
    If @error Then
    Return 0
    Else
    Return 1
    EndIf
    EndFunc

    [/autoit]
  • wir hatten mal wieder die gleiche idee *ggggggg*

  • Hallo LilProgger208,

    Zitat

    @autowert: dabei wird übergeben, wo ein wert im speicher steht, statt den eigentlichen wert zu übergeben


    zwar sehr einfach beschrieben, denke aber du hast das Prinzip verstanden. Auszug aus Hilfe

    Zitat

    Das Schlüsselwort ByRef ist optional und bedeutet:
    (1) der Parameter muss eine Variable sein und
    (2) die originale Variable ist mit dem Parameter verbunden, so dass sich jegliche Änderungen an dem Parameter innerhalb der Funktion in gleichem Maße auf die originale Variable auswirken.
    Dies nennt man Übergabe der Variable/n per Referenz.
    Standardmäßig wird ein Parameter per Wert übergeben, was bedeutet, dass eine Kopie des Parameterwertes durch die Funktion manipuliert wird.


    Es gibt Funktionen, in denen die Parameter ByRef deklariert sind siehe Beispiel funkey viele andere tun das nicht. Es ist also wichtig, das du dieses Prinzip verstehst (ich glaube auch schon verstanden hast, ansonsten lies die die Hilfe zu Func .. EndFunc nochmal genau durch), damit ist doch deine Frage eigentlich von dir selbst schon beantwortet.

    Ps.: mein Nickname ist AutoBert nicht AutoWert (aber das war warscheins ein Freud'scher Verschreiber)

    mfg (Auto)Bert

  • danke bugfix und oliver, die gleiche idee hatte ich auch bereits, ist nur ziemlich hässlich zu lesen ^^

    @xeno:
    wieso macht das keinen sinn? wenn du stringsplit selbst schreibst (nicht nur eine umschachtelnde funktion) - angenommen eine zeichenkettekette von 5.000.000 "bla|"s und du splittest bei | - dann hast du ein array mit 5.000.000(+1) einträgen - und das wird im return "normal" übergeben - wie lang soll das dauern?
    klar könnte man in dem fall den string byref übergeben und die adresse dann auf die vom array ändern - aber was, wenn du den string selbst noch nutzen willst?
    etc....

    gut, das ganze ist jetzt natürlich ziemlich gekünstelt, aber das prinzip sollte klar werden

    • Offizieller Beitrag

    Hi,

    das hilft dir trotzdem nicht. Du kannst immer nur das Original ändern, oder es kopieren. Wenn du es kopieren willst, dann ist auch egal wann.

    Wo ist der Mehrwert?

    [autoit]

    #include <Array.au3>
    Local $ergebnisSplit
    If _mySplit('12345', '', $ergebnisSplit) Then _ArrayDisplay($ergebnisSplit)

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

    Func _mySplit($string, $trenner, ByRef $egalWas)
    $ergebnisSplit = StringSplit($string, $trenner, 2)
    If @error Then
    Return 0
    Else
    $egalWas = 10
    ConsoleWrite($egalWas & @CRLF)
    Return 1
    EndIf
    EndFunc ;==>_mySplit

    [/autoit]

    Mega

  • streng genommen hast du recht - wenn du die daten verarbeitest werden sie irgendwann kopiert - so werden sie aber gleich 2 mal kopiert (einmal vom string in das array und einmal vom dem array zum array in der aufrufenden funktion) - aber einen der kopiervorgänge könnte man sparen