Modify

Opened 6 years ago

Closed 6 years ago

#3643 closed Bug (No Bug)

For...To...Step...Next - variable is NOT (see Remarks in AutoIt Help) in Local scope!

Reported by: Bitnugger Owned by:
Milestone: Component: AutoIt
Version: 3.3.14.5 Severity: None
Keywords: Cc:

Description

#include <AutoItConstants.au3>

Local $sScope, $sRemarks = ' --> Remarks: The variable will be created automatically with Local scope, even when MustDeclareVars is on.'
ConsoleWrite('> For $i = 0 To 1 Step 1' & @CRLF)
For $i = 0 To 1 Step 1
	ConsoleWrite('@ $i = ' & $i & @CRLF)
Next
Switch IsDeclared('i')
	Case $DECLARED_GLOBAL  ;  1
		$sScope = '! $i = $DECLARED_GLOBAL  ( 1) '
	Case $DECLARED_LOCAL   ; -1
		$sScope = '+ $i = $DECLARED_LOCAL   (-1) '
	Case $DECLARED_UNKNOWN ;  0
		$sScope = '- $i = $DECLARED_UNKNOWN ( 0) '
EndSwitch
ConsoleWrite($sScope & $sRemarks & @CRLF)

Attachments (0)

Change History (4)

comment:1 Changed 6 years ago by Jos

Any variable in the main part of the script is global.
Try this version to see what i mean:

#include <AutoItConstants.au3>

Local $sScope, $sRemarks = ' --> Remarks: The variable will be created automatically with Local scope, even when MustDeclareVars is on.'
ConsoleWrite('> For $i = 0 To 1 Step 1' & @CRLF)
For $i = 0 To 1 Step 1
	ConsoleWrite('@ $i = ' & $i & @CRLF)
Next
Switch IsDeclared('i')
	Case $DECLARED_GLOBAL ;  1
		$sScope = '! $i = $DECLARED_GLOBAL  ( 1) '
	Case $DECLARED_LOCAL ; -1
		$sScope = '+ $i = $DECLARED_LOCAL   (-1) '
	Case $DECLARED_UNKNOWN ;  0
		$sScope = '- $i = $DECLARED_UNKNOWN ( 0) '
EndSwitch
ConsoleWrite($sScope & $sRemarks & @CRLF)
Demo()

Func Demo()
	#include <AutoItConstants.au3>

	Local $sScope, $sRemarks = ' --> Remarks: The variable will be created automatically with Local scope, even when MustDeclareVars is on.'
	ConsoleWrite('> For $i = 0 To 1 Step 1' & @CRLF)
	For $i = 0 To 1 Step 1
		ConsoleWrite('@ $i = ' & $i & @CRLF)
	Next
	Switch IsDeclared('i')
		Case $DECLARED_GLOBAL ;  1
			$sScope = '! $i = $DECLARED_GLOBAL  ( 1) '
		Case $DECLARED_LOCAL ; -1
			$sScope = '+ $i = $DECLARED_LOCAL   (-1) '
		Case $DECLARED_UNKNOWN ;  0
			$sScope = '- $i = $DECLARED_UNKNOWN ( 0) '
	EndSwitch
	ConsoleWrite($sScope & $sRemarks & @CRLF)
EndFunc   ;==>Demo

Jos

Version 0, edited 6 years ago by Jos (next)

comment:2 Changed 6 years ago by anonymous

Ok, better I would have said it's not an error ... but that the text under Remarks leads to assumption that $i would be in the Local scope anyway.

The trigger for my ticket was the Notify UDF by Melba23 ... line 47-49.

#include <Array.au3>
#include <Notify.au3>

;~ 	... ; Notify.au3 - line 46
For $i = 0 To UBound($aNotify_Settings, 2) - 1 ; $i = Global scope!!!
	$aNotify_Settings[1][$i] = $aNotify_Settings[0][$i]
Next
;~ 	...

ConsoleWrite(_ArrayToString(_MyFunc(), ', ') & @CRLF)

Func _MyFunc()
	Local $aRet[7] = [1, 2, 3, 4, 5, 6, 7]
;~ 	... ; No error... funny, how can that? $i is not declared in this function! ;-)
	$aRet[$i] = 10000 ; <--
;~ 	...
	Return $aRet
EndFunc

comment:3 Changed 6 years ago by Jos

This is how it is described in the Helpfile under: AutoIt/Language Reference/Variables and look for the paragraph Scope:
===========================================================================================
Scope
A variable's scope is controlled by when and how you declare the variable. If you declare a variable at the start of your script and outside any functions it exists in the global scope and can be read or changed from anywhere in the script.

If you declare a variable inside a function it is in local scope and can only be used within that same function. Variables created inside functions are automatically destroyed when the function ends.

By default when variables are declared using Dim or assigned in a function they have local scope unless there is a global variable of the same name (in which case the global variable is reused). This can be altered by using the Local and Global keywords to declare variables and force the scope you want.

See Static for details on how to use this keyword as part of the scope declaration.

============================================================================================

Hope that explains it.
Jos

Last edited 6 years ago by Jos (previous) (diff)

comment:4 Changed 6 years ago by Jos

  • Resolution set to No Bug
  • Status changed from new to closed

Guidelines for posting comments:

  • You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
  • In-depth discussions should take place on the forum.

For more information see the full version of the ticket guidelines here.

Add Comment

Modify Ticket

Action
as closed The ticket will remain with no owner.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.