Assume-Local/Static/Global-Modi

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

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

Assume-Local/Static/Global-Modi

29 Mar 2021, 05:03

Hallo,
warum bringt nur Local M den korrekten ToolTip M: Nr. 20
M1: 20
Z: 100

Code: Select all

q::Nummer("Nr. 20")

Nummer(Text)
{
	; Local			;funkt. nicht
	Local M			;funkt.
	; Local M, M1	;funkt. nicht
	T := Text, Z := 100
	SetTimer, Timer, -100
	Return
	Timer:
	RegExMatch(T, "\D*(\d*)", M)
	ToolTip,% "M: " M "`nM1: " M1 "`nZ: " Z
	Return
}
und keine der anderen zwei Versionen?

Hintergrund: Ich habe Folgendes geschrieben und möchte nun wissen was da genau abgeht.

Code: Select all

q::
SendText("Hello {1000}World!{Enter}",200,1)
KeyWait, q
SendText()
Return

SendText(Text:="",Delay:=60,Repeat:=0)
{   Local K
    SetTimer,S_T,% D:=Delay,T:=O:=Text,R:=Repeat
    Return ; SendText("Hello {1000}World!{Enter}",200)
    S_T:   ; means: 200 ms per character, 1000 ms Sleep, no Repeat
    RegExMatch(T,"\{(\d{2,})\}|\{[^\}]*\}|.", K)
    SendInput,% ["{Text}"][StrLen(K)] (K1?:K)
    SetTimer,S_T,% (""<T:=StrReplace(T,K,,,1))?Max(D,0 K1):R?(D,T:=O):"Off"
    Return ; timer stop: SendText() or, if not repeated, end of text 
}
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Assume-Local/Static/Global-Modi

29 Mar 2021, 11:18

Moin,

Du gräbst immer wieder überraschende Sachen aus. ;)

Auf den ersten Blick hätte ich vermutet, dass das überhaupt nicht funktionieren kann. Dann kam das Erstaunen, dann das Grübeln und dann (vielleicht) die Erleuchtung.
Assume-Global-Modus: Muss eine Funktion viele globale Variablen erstellen oder auf sie zugreifen, kann die Funktion so definiert werden, dass sie all ihre Variablen (außer ihre Parameter) global behandelt. Dazu muss in der ersten Zeile entweder das Wort "global" stehen oder eine lokale Variable deklariert sein.

Code: Select all

Local M     ;funkt.
erzwingt den Assume-Global-Modus. Daraus folgt, dass die Variablen T und Z global sind. Irgendwie scheint es auch dafür zu sorgen, dass die Variablen M undM1 in einem gemeinsamen 'Gültigkeitsbereich' existieren.

Code: Select all

Local M, M1 ;funkt. nicht
scheint dagegen unter die Kathegorie Häufiger Anlass zu Verwirrung: zu fallen.

Code: Select all

q::
Nummer("Nr. 20")
MsgBox, T: %T%`nM: %M%`nM1: %M1%`nZ: %Z%
Return

Esc::ExitApp

Nummer(Text)
{
   ; Local       ;funkt. nicht
   Local M     ;funkt.
   ; Local M, M1 ;funkt. nicht
   T := Text, Z := 100
   SetTimer, Timer, -100
   Return
   Timer:
   RegExMatch(T, "\D*(\d*)", M)
   ToolTip,% "T: " T "`nM: " M "`nM1: " M1 "`nZ: " Z
   Return
}
Rohwedder
Posts: 7623
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Assume-Local/Static/Global-Modi

29 Mar 2021, 13:33

Stimmt! Local M erzwingt den Assume-Global-Modus.
Hotkey W ausgeführt nach Q, zeigt das.
Unschön! Ich wollte meine Funktion so lokal wie möglich halten ohne die Funktion von RegExMatch zu verlieren.
Static T, Z, Local M ist schon besser. Nur noch M1 wird global.

Code: Select all

T := Z := M := M1 := 007 ;Test ob 007 die Funktion überlebt
q::Nummer("Nr. 20")
w::ToolTip,% T " > " Z " > " M " > " M1

Nummer(Text)
{
	; Global ; T, Z, M, M1 werden global (worst case)
	; Local M ; T, Z, M1 werden global (besser)
	Static T, Z, Local M ; nur M1 wird global (besser geht`s wohl nicht)
	T := Text, Z := 100
	SetTimer, Timer, -100
	Return
	Timer:
	RegExMatch(T, "\D*(\d*)", M)
	ToolTip,% "M: " M "`nM1: " M1 "`nZ: " Z
	Return
}
Zum Kapitel Häufiger Anlass zu Verwirrung: Erstaunlich diese Kongruenz von Überschrift und Inhalt!
Warum mein Timer die lokalen Variablen T und Z noch lesen kann, gehört auch in dieses Kapitel.
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Assume-Local/Static/Global-Modi

30 Mar 2021, 04:27

Nochmal zum Thema Häufiger Anlass zu Verwirrung:
Wenn man solche Situationen austesten will, sind Zeilen wie mein MsgBox, T: %T%`nM: %M%`nM1: %M1%`nZ: %Z% oder dein T := Z := M := M1 := 007 ;Test ob 007 die Funktion überlebt nicht zwingend hilfreich. Die erzeugen beim start ja die Variablen im globalen Gültigkeitsbereich.
Rohwedder
Posts: 7623
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Assume-Local/Static/Global-Modi

30 Mar 2021, 05:13

Ich habe Dies leider erst jetzt richtig verstanden!

Code: Select all

MsgBox %V1% > %V2% ;noch beide leer
Funktion()
MsgBox %V1% > %V2% ;V1 wurde gefüllt

Funktion()
{
	Eins = 1
	V%Eins% := 1 ;globale Variable V1
	V2 = 2		 ;lokale  Variable V2
}
Mich interessiert der Grund für die Installation dieser Tretmine.
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Assume-Local/Static/Global-Modi

30 Mar 2021, 05:28

Ich habe keine Ahnung und kann mir auch keinen 'vernünftigen' Grund vorstellen. Funktionen sollten meiner Meinung nach nicht 'unbeauftragt' in den globalen Namensraum greifen.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 40 guests