Problem mit Funktionen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

gero
Posts: 168
Joined: 02 Oct 2013, 05:36

Problem mit Funktionen

27 Nov 2013, 22:17

Hallo zusammen
Ich stehe irgendwie auf der Leitung.
Bin ja nicht so der Experte und arbeite mich gerade in Funktionen ein.
Funktionen können ja per ByRef mehrere Werte zurückgeben. Wenn ich nun eine Funktion local lasse, aber nur einen einzelnen Wert, von mehreren möglichen, zurückbekommen will, wie rufe ich die Funktion da auf ?
Wenn ich z.B. nur R2 als Rückgabe haben will (Funktion soll aber "local" sein) ?
(global ist es ja kein Problem, da kommt ja alles zurück R1, R2 und R3)
Geht das überhaupt ?

Beispiel:

Code: Select all

Test(s1,s2)
{
hier die Operationen
returnByRef (R1 ,R2, R3)
}
gruss
gero
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Problem mit Funktionen

28 Nov 2013, 00:13

Code: Select all

MsgBox % addieren(12,10)
return

addieren(s1,s2) {
    addiert := s1 + s2
return addiert
}
Diese Funktion ist lokal. Es wird ein Wert per Return zurück gegeben.
Wenn man mehrere Werte zurück geben will kann man diese in ein Array packen und dann das Array zurück geben.

Wenn man ByRef benutzt, dann muss das direkt in der Variablendefinition mit angegeben werden, aber ich denke nicht dass dieses in deinem Fall nötig sein wird.

Lies dir mal das hier durch.
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Problem mit Funktionen

28 Nov 2013, 00:29

Hallo,

die Option ByRef bezieht sich auf die Funktionsparameter und kann nur in der Kopfzeile der Funktionsdeklaration angegeben werden:

Code: Select all

Test(ByRef S1, ByRef S2) ; <- nur hier
{
   ...
}
Sie bewirkt, dass nicht - wie ohne diese Angabe - eine funktionslokale Kopie der Variablen, sondern die Originalvariable (genauer gesagt: ihre Adresse) an die Funktion übergeben wird. Wenn eine ByRef Variable innerhalb der Funktion geändert wird, wird damit auch die übergebene Originalvariable geändert. Die Änderung muss nicht mit Return Var zurückgegeben werden.

Dein Beispiel "returniert" überhaupt nichts. Weil es die AnweisungreturnByRef nicht gibt, macht AHK daraus einfach einen Variabennamen. Die Zeile returnByRef (R1 ,R2, R3) hängt per "auto-concat" (automatische Verkettung) den Wert des Ausdrucks (R1, R2, R3) (in AHK 1.1 wäre das der Inhalt von R1) an die Variable returnByRef an. Deine Funktion endet deshalb ohne Return Anweisung, gibt also Nichts zurück.

Edit: Moin Holle!

Edit2: Ein Beispiel sagt manchmal mehr als tausend Worte:

Code: Select all

#NoEnv
R1 := 1
R2 := 1
MsgBox, 0, Vorher, R1 = %R1% - R2 = %R2%
ReturnWert := Test(R1, R2)
MsgBox, ReturnWert = %ReturnWert%
MsgBox, 0, Nachher, R1 = %R1% - R2 = %R2%
ExitApp

Test(ByRef S1, ByRef S2)
{
   ; hier die Operationen
   S2 := 2 ; hier wird tatsächlich die übergebene Variable R2 verändert
   Return "S2 wurde auf 2 gesetzt!"
}
gero
Posts: 168
Joined: 02 Oct 2013, 05:36

Re: Problem mit Funktionen

28 Nov 2013, 03:01

Moin ... erst mal danke für eure Mühe am frühen Morgen !
Aber ich blicks nicht wirklich, kann's wahrscheinlich nicht richtig formulieren.
Das ByRef habe ich so einigermassen verstanden.
Ich möchte aber die Rückgabewerte R1,R2,R3 der Funktion geziel abrufen können

Code: Select all

#NoEnv
#SingleInstance force
S1=10
S2=20
xx:=TEST(S1,S2) ; <<<  xx soll nur den Wert R2 abrufen können !?
MsgBox,% xx

TEST(S1,S2)
{
R1:=100 - S1
R2:=S1 + S2
R3:= S1 * 5
return (R1,R2,R3)
}
(So wie oben, liefert die Funktion 90 = R1 zurück - ich will aber R2)
Ich möchte die Funktion so aufrufen können, dass sie nur z.B. R2 zurückgibt ... R1 und R3 sollen innerhalb der Funktion bleiben - also im Script als Variable noch nicht vorhanden sein. R1 und R2 sollen dann an anderer Stelle mit anderen S1 und S2 -Werten berechnet werden.
Geht das ?
User avatar
Seidenweber
Posts: 17
Joined: 30 Sep 2013, 11:40

Re: Problem mit Funktionen

28 Nov 2013, 04:17

Dann mach mal aus den runden Klammern

Code: Select all

return (R1,R2,R3)
eckige Klammern

Code: Select all

return [R1,R2,R3]
und beim Aufruf der Funktion gibst du statt nur

Code: Select all

xx:=TEST(S1,S2)
auch das Element des Arrays an, was du an xx übergeben willst

Code: Select all

xx:=TEST(S1,S2)[2] ; Element #2 ist R2
Questions and answers are related to AHK 1.1.13.01 (x64) & Win 7 pro x64
fredchf
Posts: 54
Joined: 30 Sep 2013, 14:55

Re: Problem mit Funktionen

28 Nov 2013, 04:20

Moin gero!
Siehe Holle's Post. ;)

Code: Select all

#NoEnv
#SingleInstance force
S1=10
S2=20
xx:=TEST(S1,S2) ; <<<  xx soll nur den Wert R2 abrufen können !?
MsgBox,% xx.1
MsgBox,% xx.2
MsgBox,% xx.3

TEST(S1,S2)
{
R := {} ; Objekt
R.1:=100 - S1
R.2:=S1 + S2
R.3:= S1 * 5
return R
}
EDIT:
@Seidenweber:
Wow, das geht auch so? :)
gero
Posts: 168
Joined: 02 Oct 2013, 05:36

Re: Problem mit Funktionen

28 Nov 2013, 07:16

Hallo zusammen
Wunderbar (!) ... ganz genau so wollte ich es haben .... :D
Ich danke euch allen, insbesondere Seidenweber ... so einfach - gewusst wie,
da kann ich ja sogar die Variablen innerhalb der Funktion benennen wie ich will,
wenn sie denn nur in der [Klammer] stehen ... geil !
Mit richtigen Arrays hatte ich bisher nix zu tun, darum bissl Verständnisprobleme ...

gruss
gero

EDIT//

@Seidenweber ... das ist nicht nur einfach geil, das ist ... boahhh ... DANKE ... mir
dämmern grad die Möglichkeiten was alles damit so geht ...
User avatar
SAPlayer
Posts: 48
Joined: 30 Sep 2013, 13:38
Location: Germany
Contact:

Re: Problem mit Funktionen

29 Nov 2013, 10:11

Kleiner Tipp:
Wenn du es etwas übersichtlicher haben willst, kannst du auch assoziative Arrays nutzen, um als Schlüssel eine eigene Bezeichnung anzugeben:

Code: Select all

return {R1: R1, R2: R2, R3: R3} ;das weist den jeweiligen Schlüsseln (R1, R2 usw.) den jeweiligen Variableninhalt zu (es ist auch jeder andere Schlüsselname möglich)

xx := TEST(S1, S2)["R2"] ;das ruft den entsprechenden Schlüsselnamen ab
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Problem mit Funktionen

29 Nov 2013, 14:10

Oh dir dämmern Möglichkeiten?

Code: Select all

Class test {
r1:=0
r2:=0
r3:=0
ss1:=0
ss2:=0
__set(s,set) ; meta funktion aufgerufen wenn ein wert der Klasse verändert wird, welches nicht da ist!
{
this["s" s]:=set
this.r1:=100 - this.ss1
this.r2:=this.ss1 + this.ss2
this.r3:= this.ss1 * 5
return [this.r1,this.r2,this.r3]
}
}

a:=new test() ; objekt erstellen
a.s1:=10
a.s2:=12
Msgbox % a.r1
Msgbox % a.r2
Msgbox % a.r3
a.s1:=100
Msgbox % a.r1
Msgbox % a.r2
Msgbox % a.r3
a.s2:=120
Msgbox % a.r1
Msgbox % a.r2
Msgbox % a.r3
:D
Recommends AHK Studio

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 27 guests