Jump to content
Sign in to follow this  
butterfly

About Global Local and For next $z help me tutorial

Recommended Posts

butterfly

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

Share this post


Link to post
Share on other sites
water

tl;dr

All you need to know about Global/Local is described in the Help file or in the Wiki.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • nacerbaaziz
      By nacerbaaziz
      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
    • California
      By California
      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?
    • InunoTaishou
      By InunoTaishou
      I know on other languages when you try to use a string like this
      Global $sString = "Some String" If ($sString) Then ; ... EndIf The compiler will fail because string cannot be used in an expression where it needs a bool (something along those lines). But I see instances in other languages where using $sString in an expression will work and implicitly use the length of the string (or because there is some value in that variable).
      I'm wondering why AutoIt doesn't do the same. If the $sString is used like in my example (or some other expression where it wants a bool type) implicitly use the length of the string instead of the converting to 0?
    • TheDcoder
      By TheDcoder
      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!
    • ZeroByDevide
      By ZeroByDevide
      so right now i have a small project and i wanted to print this text out every second.
      i have made a random number for the sleep function. but when i want to print out with the while loop it just doesn't work.
      Run("notepad.exe") Sleep(1000) Local $rndSleep = Int (Random(180000,240000,1000)) While $rndSleep <> 0 $rndSleep - 1 If Mod ( $rndSleep, 1000 ) == 0 Then Send("This note will show the sleeptime before closing the tabs, you got " & $rndSleep & " seconds left.") EndIf WEnd plis halp me 
×