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" ?
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" ?
für was soll das gut sein?
zb wenn ein array in einer function erstellt wird - ich erinner da mal an funktionen wie stringsplit....
#Include <Array.au3>
$string="string1|string2"
Func _splitString($str)
$stringSplitted=StringSplit($str, "|")
Return $stringSplitted
EndFunc
$result=_splitString($string)
_ArrayDisplay($result)
Hallo LilProgger208,
versuch mal mir zu erklären, was du unter Parameterübergabe beim Aufruf ByRef verstehst.
mfg (Auto)Bert
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.
Local $Test_ByRef = 4
[/autoit] [autoit][/autoit] [autoit]$Test = _Byref_Test($Test_ByRef)
MsgBox(0, "ByRef", $Test_ByRef&@CRLF&$Test)
Func _Byref_Test(ByRef $Variable)
$Variable += 2
Return $Variable
EndFunc
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
ist es möglich, einen parameter byref zurück zugeben?
Zitatzb 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:
#include <Array.au3>
Local $ergebnisSplit
If _mySplit('12345', '', $ergebnisSplit) Then _ArrayDisplay($ergebnisSplit)
Func _mySplit($string, $trenner, ByRef $ergebnisSplit)
$ergebnisSplit = StringSplit($string, $trenner, 2)
If @error Then
Return 0
Else
Return 1
EndIf
EndFunc
Alles anzeigen[autoit]
Dann deklariere einfach vorab den Ergebnisspeicher und übergib die Variable dazu beim Aufruf der Funktion mit ByRef:#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
Local $ergebnisSplit
If _mySplit('12345', '', $ergebnisSplit) Then _ArrayDisplay($ergebnisSplit)Func _mySplit($string, $trenner, ByRef $ergebnisSplit)
[/autoit]
$ergebnisSplit = StringSplit($string, $trenner, 2)
If @error Then
Return 0
Else
Return 1
EndIf
EndFunc
wir hatten mal wieder die gleiche idee *ggggggg*
Hi,
das ganze Thema macht keinen Sinn. Entweder ich bekomme eine Adresse übergeben und ändere quasi das lebende Objekt, oder ich kopiere den Wert und verändere diesen und gebe diesen dann zurück (als veränderte Kopie)
Mega
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
ZitatDas 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
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)
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
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