Search the Community
Showing results for tags 'global'.
-
hi dears, i have an question please if you can help me. i maked an program to do some functions and this program works with the global hot keys i added an option to the users to change the hot keys when i searched about how to do that i found this UDF GUIHotkey.au3 http://www.autoitscript.com/forum/index.php?showtopic=107965 but the problem here that this UDF cant be detect the win key. can you help me to add it, or if there are any others UDFSS wich do that work please give me some. i hope that my question is clear for you. thanks in advance
-
Hello, I wrote a benchmark script to measure variable declarations to find out whether you should focus more on static or global variables #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 #ce ---------------------------------------------------------------------------- #Region Pre-Setting Local $iTally1 = 0 Local $iTally2 = 0 Local $iTally3 = 0 Local $iTally4 = 0 Local $iTally5 = 0 Local $iTally6 = 0 Local $iTally7 = 0 Global $GLOBALCONST1 = 1 Global $GLOBALCONST2 = 1 Global $GLOBALCONST3 = 1 Global $GLOBALCONST4 = 1 Global $GLOBALCONST5 = 1 #EndRegion Pre-Setting #Region Test Functions Func s1() Static $i = $GLOBALCONST1 Return $i EndFunc Func g2() Return $GLOBALCONST2 EndFunc Func g3() Static $i7 = "gsdgdfegbgbrwefw" Return $GLOBALCONST3 EndFunc Func g4() Static $i1 = 1 Static $i2 = "asd" Static $i3 = 234 Static $i4 = True Static $i5 = [0] Static $i6 = "hgsdg" Static $i7 = 1 Static $i8 = 1 Static $i9 = 1 Static $i0 = 1 Return $GLOBALCONST4 EndFunc Func g5() Local $i = $GLOBALCONST5 Return $i EndFunc Func g6() Local $i = 1 Return $i EndFunc Func g7() Return 1 EndFunc #EndRegion Test Functions #Region Benchmark Loop For $i = 0 To 15 Local $tDelta = TimerInit() Do $iTally1 += s1() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally2 += g2() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally3 += g3() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally4 += g4() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally5 += g5() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally6 += g6() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally7 += g7() Until TimerDiff($tDelta) >= 1000 Next #EndRegion Benchmark Loop ConsoleWrite(@CRLF&"Static1: "&$iTally1&" pkt"&@CRLF&"Global2: "&$iTally2&" pkt"&@CRLF&"Global3: "&$iTally3&" pkt"&@CRLF&"Global4: "&$iTally4&" pkt"&@CRLF&"Local5: "&$iTally5&" pkt"&@CRLF&"Local6: "&$iTally6&" pkt"&@CRLF&"Hardcode7:"&$iTally7&" pkt"&@CRLF) #cs Result Static1: 10291881 pkt global to static Global2: 13977324 pkt only global Global3: 9886169 pkt global and static Global4: 2933051 pkt global and many statics Local5: 9937314 pkt global to local Local6: 10306484 pkt only local Hardcode7: 14835319 pkt no variable #ce Result: 100% no variable, hardcore value 94% only global variable use 69% only local variable use with hardcore value set 69% only static variable use with global variable value set 67% declaration of local variable with global variable value set 66% only global variable use with one static variable beside 20% only global variable use with ten static variables beside My thesis of the result: Be careful with declarations, whether local, global or static Note: in my test the global variable performance was better than the local one, but in practice the global one would lose performance due to multiple operations What is your best practice sharing data between multiple functions?
- 1 reply
-
- performance
- declaring
-
(and 3 more)
Tagged with:
-
Hello everyone, I discovered a bug yesterday and I posted it at the bug tracker: I also made a simple script which can be used to reproduce the bug: CreateVariable() ConsoleWrite($sGlobalVariable & @CRLF) Func CreateVariable() Global $sGlobalVariable = "Foobar" EndFunc The bug was closed by @BrewManNH: While I partially agree with the above statement, My code was not practical enough... so @mLipok advised me to create a thread on the forums with practical code (Thanks!). That is the point of this thread, I am going to provide the code where I experience this bug/problem . I discovered this bug when I was working on one of my projects called "ProxAllium". When the main script finishes execution, Au3Check throws a nasty warning about "variable possibly used before declaration": As you can see, the variable is indeed being used after calling the function in which the variable is declared... The warning won't appear if I declare the function ABOVE the variable. As @BrewManNH said, Au3Check reads line by line... I think this should be changed, Au3Check should not throw warnings if the interpreter is able to run the code, at least most of the time anyway! So what do you guys think? Is this a valid bug?... and I request those who participate in the discussion not to discuss the code being "poor", that is another thing/thread in itself P.S I had already written this once but the forum editor decided to mess up and when I undid (Ctrl + Z) something... This is a poorly written version of that article, I was very frustrated while writing this!
-
I'm trying to use #OnAutoItStartRegister to modify the Global variable, but it seems it doesn't work, is that on purpose, that those callback functions cannot modify anything except in their own scope?
-
An example (or one variation at least) that I created in a discussion we (devs/mods) were having about protecting global variables. ; An enumeration for the getters and setters, as I hate having to write zero and one Global Enum $VERSION_WRAPPER_GET, $VERSION_WRAPPER_SET ; Unused, as I have hidden behind functions, so users who might feel the need to do this $g_iVersion = 'Haha, I''m no a number', can't! ; Global $g_iVersion = 0 ; Basically this is encapsulation and is just one of many principals found in Object Oriented Programming (OOP) ; NOTE: There is no way for me to access the "global" version variable without using the _Get/Set_Version() function(s) Example() Func Example() ; Set to 10, as only integer datatypes are allowed _Set_Version(10) ; Displays 10 ConsoleWrite('1. ' & _Get_Version() & @CRLF) ; Set to a non-digit. Such a bad user/dev! _Set_Version('Not a number') ; Displays 10, as a string was passed previously that wasn't valid ConsoleWrite('2. ' & _Get_Version() & @CRLF) ; Call another function to show that it's not just visible within this function Another_Func() ; Displays 99, which was previously set in the Another_Func() ConsoleWrite('4. ' & _Get_Version() & @CRLF) ; If the variable located in __Version_Wrapper() was purely a global variable, then anything could be assigned to it ; without proper checking. As you can see below, the variable is only assigned to when certain criteria is met ; Before someone mentions performance, you have to weigh up the pros and cons of such a design choice. If you really need data to be protected ; from your users mingling with it, then this is one of many correct approaches to encapsulate data. Otherwise if you're not concerened, then ; maybe it's not for you. You're the developer when it comes down to it EndFunc ;==>Example Func Another_Func() ; Displays 10 ConsoleWrite('3. ' & _Get_Version() & @CRLF) ; Set to 99 and return back to the previous function i.e. Example() _Set_Version(99) EndFunc ;==>Another_Func ; Getter Func _Get_Version() Return __Version_Wrapper($VERSION_WRAPPER_GET) EndFunc ;==>_Get_Version ; Setter Func _Set_Version($iVersion) Return __Version_Wrapper($VERSION_WRAPPER_SET, $iVersion) EndFunc ;==>_Set_Version ; This is a wrapper for the local static variable that will be visible only in the function and for the duration of the application's ; lifecycle ; $iType: Either $VERSION_WRAPPER_GET or $VERSION_WRAPPER_SET ; $iVersion: Used when the type is $VERSION_WRAPPER_SET Func __Version_Wrapper($iType, $iVersion = Null) ; Create a local static variable and initialise to 0 Local Static $s_iVersion = 0 Switch $iType Case $VERSION_WRAPPER_GET ; Getter Return $s_iVersion Case $VERSION_WRAPPER_SET ; Setter ; Now is the chance to check if the value meets certain criteria e.g. [0-9]+ and not a string datatype If StringRegExp($iVersion, '^\d+$') And Not IsString($iVersion) Then $s_iVersion = $iVersion EndIf EndSwitch ; Return null by default, especially if the type is as a setter Return Null EndFunc ;==>__Version_Wrapper
- 7 replies
-
- encapsulation
- getters
-
(and 3 more)
Tagged with:
-
Atom Table UDF Local and Global Atom Table Since I've had this collecting dust on my computer, I figured I'd release it to see if anyone can find some use for it. About Atom Tables - MSDN Example Global Atom Table Listing Basically, a bunch of strings can be stored locally (at program level) or globally (at O/S level) with unique numerical identifiers. This UDF lets you add, find, delete, and query these atoms. Description from the top of the AtomFunctions UDF: ---------------------------------------------------------------- Functions for accesing Local and Global Atom Tables, which contain strings up to 255 characters long The Atom tables are used for multiple types of Windows data including Window Classes (RegisterClass/Ex), Clipboard formats (RegisterClipboardFormat), Hotkeys (RegisterHotKey), and Dynamic Data Exchange (DDE) which is a form of interprocess communication. (Some of the above may use a Local rather than the Global Atom table) Other uses can include storing program strings to lookup by a 16-bit value and interprocess communication "RegisterHotKey function" @ MSDN states this: "An application must specify an id value in the range 0x0000 through 0xBFFF. A shared DLL must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function). To avoid conflicts with hot-key identifiers defined by other shared DLLs, a DLL should use the GlobalAddAtom function to obtain the hot-key identifier." Kernel Note: The Atom Table is a separate entity from Kernel Objects like Events, Mutexes, Files, etc. However, the Atom Table is (separately) accessible from within the Kernel, so its like a Kernish object? Notes on Atom Tables: Stringlimit is 255 characters NOT including a null-terminator. This is unfortunately not enough for a MAX_PATH string, which is 259+null-term. However, stripping off root-drive prefix get you within 1 character of the length (259 - 3 ["C:"] = 256] which may be enough - but using IPC, one can store 4 - 6 (8-12 in x64) extra chars in wParam/lParam.. See <AtomExample_IPC.au3> for an implementation of this There is both a Local and Global Atom Table. The Local one is local to this Process, and the Global one is available/accessible to/from all Processes. Atoms numbered 0 - 49151 (0xBFFF) are not actually part of the Atom Table. Querying these values will return a string representation of the number as an unsigned integer Example: 1234 is translated to "#1234" Adding atom strings that start with a "#" will return an unsigned integer if the numbers following "#" are an integer less than 49152 (1 - 49151 [0xBFFF]). Examples: "#1" => 1, "#49151" => 49151 Atoms numbered from 49152 - 65535 (from 0xC000 - 0xFFFF) DO reference the Atom Table strings Maximum Atom string length is 255 characters (not including a null-terminator) Functions: ; Local: ; _AtomTableInit() ; Initializes Local Atom Table. Optional [37 hash buckets allocated by default] ; _AtomAddLocal() ; Adds a string to the Local Atom table, returns # identifier [increments reference if already exists] ; _AtomGetNameLocal() ; Gets the Local Atom string associated with a numerical identifier ; _AtomDeleteLocal() ; Decrements the reference count of Local Atom, deletes when reaches 0 ; _AtomFindLocal() ; Finds # identifier for a string in the Local Atom table ; _AtomGetAllLocal() ; Returns all found Local atoms in an array ; Global: ; _AtomAddGlobal() ; Adds a string to the Global Atom table, returns # identifier [increments reference if already exists] ; _AtomGetNameGlobal() ; Gets the Global Atom string associated with a numerical identifier ; _AtomDeleteGlobal() ; Decrements the reference count of Global Atom, deletes when reaches 0 ; _AtomFindGlobal() ; Finds # identifier for a string in the Global Atom table ; _AtomGetAllGlobal() ; Returns all found Global atoms in an array ; 'Undocumented': ; _AtomGetGlobalTableUD() ; Using 'undocumented' function calls, gets info on all Global Atoms ; _AtomGetInfoUD() ; Returns reference count, pinned status, as well as Atom Name ---------------------------------------------------------------- There are a few 'undocumented' functions used for getting information on the Atom Table included (I can't help myself). In addition to the core UDF, there's 2 example files: AtomTableExample.au3 - This demonstrates various use - adding, deleting, and querying information in the Local and Global atom tables. (Extended info comes from 'undocumented' functions) AtomExample_IPC.au3 - This demonstrates how the Atom Table could be used in InterProcess Communication. A rather rough sketch, but shows how you could squeeze MAX_PATH pathnames into IPC messages combined with Atom tables. It's all a bit light on the documentation, but I just wanted to prevent this thing from collecting more dust Might prove useful to someone! History:: AtomTablesUDF.zip ~prev Downloads: 29
-
Hello FellowForumers I have some questions about this subject and Although I have researched about i have some problems let it sink in proper Although i have basic understanding of Global and Local I Still have questions to be absolute sure: #include <Array.au3> Global $TSAB[20] While 1 trading() If $TSAB[19] = True Then MsgBox(0,"","Thank you AutoIT Forum ^^ ") ;~ If $TSAB[19] = True then Exit WEnd func trading() $TSAB[19] = "" $TSAB[7] = "" while 1 _ArrayDisplay($TSAB) $TSAB[7] = "done" _ArrayDisplay($TSAB) If $TSAB[7] = "Done" Then $TSAB = ClientDoneCommand() _ArrayDisplay($TSAB) If $TSAB[19] = True then Return $TSAB WEnd EndFunc func ClientDoneCommand() $TSAB[19] = True Return $TSAB EndFunc My own example Above gives to me Decent understanding that Global can be called anywhere in the program and that the global variable is sent and called towards other functions and loops as it was just before it got sent or returned is there anything I have to keep in mind to Prevent any big mess? Am I something missing about this or has anyone some advice? I will use this global as the soul of my program and store information on where it has been and been and what functions it has visit and what it has been doing etc Here I move to Local $var So I got the same script and added some Local var: #include <Array.au3> Global $TSAB[20] local $hugs = "" While 1 ConsoleWrite($hugs & "0" & @LF) ;Added line $hugs = trading() If $TSAB[19] = True Then MsgBox(0,"","Thank you AutoIT Forum ^^ ") ;~ If $TSAB[19] = True then Exit ConsoleWrite($hugs & "1" & @LF) ;Added line WEnd func trading() $TSAB[19] = "" $TSAB[7] = "" local $hugs = "yes" while 1 ConsoleWrite($hugs & "2" & @LF) ;Added line _ArrayDisplay($TSAB) $TSAB[7] = "done" _ArrayDisplay($TSAB) If $TSAB[7] = "Done" Then $TSAB = ClientDoneCommand($hugs) _ArrayDisplay($TSAB) ConsoleWrite($hugs & "4" & @LF) ;Added line If $TSAB[19] = True then Return $TSAB WEnd EndFunc func ClientDoneCommand($hugs) $TSAB[19] = True ConsoleWrite($hugs & "3" & @LF) ;Added line $hugs = "Maybe" Return $TSAB EndFunc Here I added a few console writes and numbered them the consolewrite output is 0 yes2 yes3 yes4 1 repeat So the following things I see in my blurry mind as are as follow at the very start I need to declare Local $hugs = "" else ; ConsoleWrite($hugs & "0" & @LF) ;Added line will have variable used before declaration (meaning nothing has been stored ever which I understand) Now here comes an interesting part to me, about: $hugs = trading() If $TSAB[19] = True Then MsgBox(0,"","Thank you AutoIT Forum ^^ ") ;~ If $TSAB[19] = True then Exit ConsoleWrite($hugs & "1" & @LF) ;Added line here Happens nothing , not even a error (which I expected) I do not get a consolewrite: 0 it does not output anything I understand that the functions has not returned the variable of local $hugs = "yes" or $hugs = "Maybe" But I expected an error, why no error? What Happens with the at line 33 $hugs = "Maybe" does it get lost? deleted (from the memory ) at the end of the function? @ line 17? local $hugs = "yes" Would it be wise to write there local $hugs = "yes" or is $hugs = "yes" Good enough , does it really matter with managing anything? and as last I also understand if I would change that at line 26 that it is not needed the write return $TSAB but just return would be good enough? because $TSAB is in every function / If / while for next loop avaiable and it will carry over the information stored inside of it? if i would change it into Return $hugs then ConsoleWrite($hugs & "1" & @LF) will give me yes1 and even at the very start of the while loop ConsoleWrite($hugs & "0" & @LF) will give me yes0 and it was previous just 0 so it seems anything wrong here? so it seems the local does not get lost at the end of the while loop then my final questions about for / next For $z = 0 to 9 For $x = 0 to 9 For $y = 0 to 9 ConsoleWrite($z & $x & $y & @LF) next next next if $z = 9 Then MsgBox(0,"","1000 ^^ ") if $x = 9 Then MsgBox(0,"","x = 9 ^^ ") if $y = 9 Then MsgBox(0,"","y = 9 ^^ ") the Variable $z , $x and $y are they only used in the for next loop or can they be used outside of it? my msgboxs do not work here after the next so i guess they end right away in the for next loop any tips or suggestions are welcome if i am saying anything wrong or retarded here Cheers Butterfly
-
Hi, I am having issues understanding something in the tutorial Melba23 gave me. At the bottom of page 22- What are Dim, Global. Local, and Scope? What do they do?
-
Playing around a bit with this idea. Note: Needs at least AutoIt version 3.3.9.0 (#1257: Fix bugs in Static array handling) Func My_Statics($sName, $vData = '') ;; parameter checkups If 1 Then ;; ... If Not IsString($sName) Then Return SetError(2) ;; name -> string only. If Not $sName Then Return SetError(3) ;; name -> no empty string. ;If StringInStr($sName, ' ') then Return SetError(4) ;; block spaces in names. ... etc ;; not checking for additional odd name cases. (presuming general valid variable name cases.) ;; note: name string are not case-sensitive in this case. EndIf Local Enum $_ind_ ;; array index field. (make global when warranted.) Local Static $asNames[1] = [0] Local Static $avData[1] = [0] Local $iSize = $asNames[$_ind_] Local $out = '' Local $err = 0 If @NumParams > 1 Then ;; data input mode. Do ;; used as name-found bailout point. For $i = 1 To $iSize If $asNames[$i] = $sName Then $avData[$i] = $vData ExitLoop 2 EndIf Next ;; Name not found. Add new name entry. $iSize += 1 ReDim $asNames[1 + $iSize] ReDim $avData[1 + $iSize] ; $asNames[$_ind_] = $iSize $avData[$_ind_] = $iSize ; $asNames[$iSize] = $sName $avData[$iSize] = $vData Until 1 Else ;; recall $err = 1 For $i = 1 To $asNames[$_ind_] If $asNames[$i] = $sName Then $out = $avData[$i] $err = 0 ExitLoop EndIf Next EndIf Return SetError($err, 0, $out) EndFunc (Only tested with strings and a array. But seems ok so far.) Error 1 (+empty string): Name not found, recall mode only. Error 2+3: Name parameter hickup. - Fixed missing constant.
-
Below is my script. Can you please tell me why I keep getting exit code 0, and the script stops? I'm expecting it to just idle in the background and await my hotkey pressing. Global $Paused HotKeySet("F7", "Cycle2") HotKeySet("F8", "Cycle1") HotKeySet("F9", "Cycle3") Func Cycle3() $Paused = NOT $Paused MouseClick("left", 920, 755, 1, 25) ;taskbar MouseClick("left", 776, 598, 1, 25) ;region MouseClick("left", 575, 565, 1, 25) ;pgdown MouseClickDrag("left", 325, 310, 500, 575, 25) Exit 0 EndFunc Func Cycle2() $Paused = NOT $Paused MouseClick("left", 920, 755, 1, 25) ;taskbar MouseClick("left", 776, 598, 1, 25) ;region MouseClick("left", 575, 565, 1, 25) ;pgdown MouseClick("left", 575, 310, 2, 25) ;up MouseClickDrag("left", 325, 310, 500, 575, 25) Global $Paused EndFunc Func Cycle1() $Paused = NOT $Paused MouseClick("left", 920, 755, 1, 25) ;taskbar MouseClick("left", 776, 598, 1, 25) ;region MouseClickDrag("left", 325, 310, 500, 575, 25) Local $i = 0 Do Sleep(2000) ;2-second sleep Cycle2() $i = $i + 1 Until $i = 7 Global $Paused EndFunc
- 2 replies
-
- HotKeySetPaused
- Global
-
(and 3 more)
Tagged with: