Lokale Variable, Bug or Feature? Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Rohwedder
Posts: 7630
Joined: 04 Jun 2014, 08:33
Location: Germany

Lokale Variable, Bug or Feature?

07 May 2019, 16:41

Hallo,
auf die innerhalb Muster() erzeugte Zeichenkette "XYZ"
kann nur außerhalb Muster() zugegriffen werden?

Code: Select all

Heuhaufen := "abcXYZ123"
Muster()
MsgBox,, außerhalb Muster(), % "Match1: " Match1
Return

Muster()
{
	Local Match1
	RegExMatch(Heuhaufen, "abc(.*)123", Match)
	MsgBox,, innerhalb Muster(), % "Match1: " Match1
}
gregster
Posts: 9002
Joined: 30 Sep 2013, 06:48

Re: Lokale Variable, Bug or Feature?

07 May 2019, 17:12

Ich versteh das so:

Du deklarierst Match1 in der Funktion als lokal - jetzt kann in der Funktion eine andere Match1-Variable existieren als außerhalb, während fortan alle anderen Variablen in der Funktion als global angesehen werden (u. a. Heuhaufen, aber auch Match). Jetzt steht aber auch in den RegExMatch-Doks (siehe Abschnitt OutputVar):
https://autohotkey.com/docs/commands/RegExMatch.htm#Parameters wrote:Within a function, to create a pseudo-array that is global instead of local, declare the base name of the pseudo-array (e.g. Match) as a global variable prior to using it.
Das heisst, da nun Match global ist, wird das durch RegExMatch erzeugte Match1 in der Pseudo-Array die globale Version von Match1, während Match1 in MsgBox,, innerhalb Muster(), % "Match1: " Match1 weiterhin die lokal definierte Version der Variable ist - immer noch leer.

Also kein Bug, würd ich sagen, sondern dok-konformes Verhalten (ergo Feature ;) ).

Setze das lokale Match1 zur Verdeutlichung:

Code: Select all

Heuhaufen := "abcXYZ123"
Muster()
MsgBox,, außerhalb Muster(), % "Match1: " Match1
Return

Muster()
{
	Local Match1
	RegExMatch(Heuhaufen, "abc(.*)123", Match)
	Match1 := "lokal"
	MsgBox,, innerhalb Muster(), % "Match1: " Match1
}
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Lokale Variable, Bug or Feature?

08 May 2019, 02:02

Anstatt jede Variable per local zu definieren würde ich 2 andere Alternativen empfehlen.
Entweder man verwendet nur local ohne spezielle Variablen und nennt alle globalen Variablen per global.
Als Alternative kann man es auch sein lassen.

Der Rest ist wirklich nur in ganz seltenen Fällen hilfreich.
Recommends AHK Studio
Rohwedder
Posts: 7630
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Lokale Variable, Bug or Feature?

08 May 2019, 02:49

Hallo,
was ich brauche ist eine globale Funktion welche intern ein paar als lokal definierte Variablen verwendet.
Muster() soll die extern definierte (globale) Variable Heuhaufen lesen können aber das durch RegExMatch erzeugte PseudoArray Match soll nur intern geschrieben und gelesen werden, d.h. lokal sein. Eine externe Version von Match soll von Muster() nicht angetastet werden.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Lokale Variable, Bug or Feature?

08 May 2019, 02:52

dafür musst du match nur lokal machen.
Recommends AHK Studio
User avatar
jeeswg
Posts: 6902
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Lokale Variable, Bug or Feature?

08 May 2019, 03:03

RegExMatch has an object mode.
GT: RegExMatch verfügt über einen Objektmodus.
DeepL: RegExMatch hat einen Objektmodus.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lokale Variable, Bug or Feature?  Topic is solved

08 May 2019, 03:20

Moin,

die einfachste Lösung für dieses spezielle RegEx Problem scheint wirklich der Objektmodus zu sein.

Code: Select all

#NoEnv
#Warn

Heuhaufen := "abcXYZ123"
Muster()
MsgBox,, außerhalb Muster(), % "Match[1]: " Match[1]

Muster()
{
	Local Match
	RegExMatch(Heuhaufen, "O)abc(.*)123", Match)
	MsgBox,, innerhalb Muster(), % "Match[1]: " Match[1]
}
Return
Ansonsten ist es nach meinem Test erforderlich, alle möglichen Ausprägungen der Variable Match als lokal zu erklären:

Code: Select all

#NoEnv
#Warn

Heuhaufen := "abcXYZ123"
Muster()
MsgBox,, außerhalb Muster(), % "Match1: " Match1

Muster()
{
	Local Match, Match1
	RegExMatch(Heuhaufen, "abc(.*)123", Match)
	MsgBox,, innerhalb Muster(), % "Match1: " Match1
}
Return
Rohwedder
Posts: 7630
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Lokale Variable, Bug or Feature?

08 May 2019, 03:38

Hallo,
nicht nur Match sondern auch Match1 muß man lokal machen.
Aber dann funktionierts!
Edit: Sehe gerade, just me hat es vor mir herausgefunden.

Code: Select all

Heuhaufen := "abcXYZ123"
Match1 := "globale Version"
Muster()
MsgBox,, außerhalb Muster(), % "Match1: " Match1
Return

Muster()
{
	Local Match, Match1
	RegExMatch(Heuhaufen, "abc(.*)123", Match)
	MsgBox,, innerhalb Muster(), % "Match1: " Match1
}
@jeeswg :Über den Objektmodus von RegExMatch habe ich zwar gelesen aber bisher keinen Nährwert darin gesehen.
Ich versuche mich z.Z. zwar mit Objekten anzufreunden da die Politik (leider) in diese Richtung geht, bin aber noch weit gekommen.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Lokale Variable, Bug or Feature?

08 May 2019, 04:03

Hmm ja das liegt nunmal daran, dass du local verwendest und alle variablen die nicht als explizit local definiert sind global werden.
Um innerhalb einer Funktion ein globales statt lokales Pseudo-Array zu erstellen, muss der Basisname des Pseudo-Arrays (z. B. Match) vor seiner Verwendung als globale Variable deklariert werden. Umgekehrt gilt das gleiche bei Assume-Global-Funktionen. Oft ist es auch notwendig, jedes Element dieses Pseudo-Arrays einzeln zu deklarieren, da ein häufiger Anlass zu Verwirrung vorliegt.

Code: Select all

Heuhaufen := "abcXYZ123"
Match1 := "globale Version"
Muster()
MsgBox,, außerhalb Muster(), % "Match1: " Match1
Return

Muster()
{
	RegExMatch(Heuhaufen, "abc(.*)123", Match)
	MsgBox,, innerhalb Muster(), % "Match1: " Match1
}
Ich kann dir wirklich nur empfehlen nicht local für alles zu verwenden.
Recommends AHK Studio
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Lokale Variable, Bug or Feature?

08 May 2019, 04:27

Hi nnnik,

des Pudels Kern liegt ja wohl hier begraben.

Bei diesem Konstrukt muss die ToolTip() Funktion assume-global gemacht werden, um auf beliebige globale Variablen zugreifen zu können. In diesem Thread ist es nur der Heuhaufen.

Meiner Meinung nach sollte es aber möglich sein, die Variablen bereits vor oder bei Aufruf von ToolTip() aufzulösen.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Lokale Variable, Bug or Feature?

08 May 2019, 04:39

Ja dachte ich mir auch.
Die Funktion ist nur für globale Zwecke geeignet - anstatt sie aber auf lokal umzustellen macht er seinen gesamten code global.
Meiner Ansicht nach ein Fehler.
Recommends AHK Studio

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 104 guests