Lokale Variable, Bug or Feature?

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Lokale Variable, Bug or Feature?

Re: Lokale Variable, Bug or Feature?

Post by nnnik » 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.

Re: Lokale Variable, Bug or Feature?

Post by just me » 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.

Re: Lokale Variable, Bug or Feature?

Post by nnnik » 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.

Re: Lokale Variable, Bug or Feature?

Post by Rohwedder » 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.

Re: Lokale Variable, Bug or Feature?

Post by just me » 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

Re: Lokale Variable, Bug or Feature?

Post by jeeswg » 08 May 2019, 03:03

RegExMatch has an object mode.
GT: RegExMatch verfügt über einen Objektmodus.
DeepL: RegExMatch hat einen Objektmodus.

Re: Lokale Variable, Bug or Feature?

Post by nnnik » 08 May 2019, 02:52

dafür musst du match nur lokal machen.

Re: Lokale Variable, Bug or Feature?

Post by Rohwedder » 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.

Re: Lokale Variable, Bug or Feature?

Post by nnnik » 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.

Re: Lokale Variable, Bug or Feature?

Post by gregster » 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
}

Lokale Variable, Bug or Feature?

Post by Rohwedder » 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
}

Top