Что нового

Глобальные переменные и цикл внутри функции

Krokodile

Новичок
Сообщения
43
Репутация
1
Переменная описана как глобальная и используется с различных функциях. В "главной/первой" функции она изменяется, точнее используется как индекс массива. В остальных/второстепенных она лишь считывается.

Вопрос, а точнее недопонимание принципов работы Autoit. Почему второстепенные функции видят только изначальное значение переменной(которое задано в Global)?

Это напоминает C++, там, если в функции используется цикл, то переменная этого цикла должна быть объявлена внутри этой функции, но в нашей справке об этом ни слова.

И как с этим бороться, НЕ используя передачу параметра в функцию?

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $k=False, $vb=1
Dim $label[6][9], $st[3], $pl[3]
$st[1]=0
$st[2]=0
$pl[1]=0
$pl[2]=0

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
GUICreate("",130,410)
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

$lb=GUICtrlCreateLabel("",0,0,500,440)
GUICtrlSetOnEvent(-1,"Switch1")

GUISetFont(92, 650)
$x=10
$y=10
For $i=1 To 5
   For $j=1 To 2
	  $label[$i][$j] = GUICtrlCreateLabel("",$x,$y,50,70)
	  GUICtrlSetOnEvent(-1,"Switch1")
	  $x+=60
   Next
   $x=10
   $y+=80
Next

GUISetState()
While 1
    If $k Then Play()
WEnd


Func Switch1()
    $k = Not $k
EndFunc
 
Func Play()
   For $vb=1 to 2
	  $st[$vb]+=1
	  If $st[$vb] > 5 Then $st[$vb] = 1
	  Switch $st[$vb]
		 Case 1
			Play1()
		 Case 2
			Play2()
		 Case 3
			Play3()
		 Case 4
			Play4()
		 Case 5
			Play5()
	  EndSwitch
   Next
EndFunc


Func Play1()
   MsgBox(0,'',$vb&' '&$st[$vb])
   $pl[$vb] += 1
   If $pl[$vb] > 2 Then $pl[$vb] = 1
   If $pl[$vb] = 1 Then 
	  GUICtrlSetData($label[1][$vb], "*")
   Else 
	  GUICtrlSetData($label[1][$vb], "")
   EndIf
   Sleep(300)
EndFunc
;*========================================================================
Func Play2()
   If $pl[$vb] = 1 Then 
	  GUICtrlSetData($label[2][$vb], "*")
   Else 
	  GUICtrlSetData($label[2][$vb], "")
   EndIf
   Sleep(300)
EndFunc
;*========================================================================
Func Play3()
   If $pl[$vb] = 1 Then 
	  GUICtrlSetData($label[3][$vb], "*")
   Else 
	  GUICtrlSetData($label[3][$vb], "")
   EndIf
   Sleep(300)
EndFunc
;*========================================================================
Func Play4()
   If $pl[$vb] = 1 Then 
	  GUICtrlSetData($label[4][$vb], "*")
   Else 
	  GUICtrlSetData($label[4][$vb], "")
   EndIf
   Sleep(300)
EndFunc
;*========================================================================
Func Play5()
   If $pl[$vb] = 1 Then 
	  GUICtrlSetData($label[5][$vb], "*")
   Else 
	  GUICtrlSetData($label[5][$vb], "")
   EndIf
   Sleep(300)
EndFunc

;*============================================================
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iID = BitAND($wParam, 0xFFFF)
    Switch $iID
        Case 0xF060
            Exit
        Case 0xF020
            GUISetState(@SW_MINIMIZE)
        Case 0xF030
            GUISetState(@SW_MAXIMIZE)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты невнимательно читал справку (или вообще не читал).
А там ясно написано
[box title=For...Next]Замечания

Переменная-счетчик автоматически создается в области видимости LOCAL даже в том случае, если опция MustDeclareVars установлена.[/box]
:IL_AutoIt_1:



Добавлено:
Сообщение автоматически объединено:

Возьми так, например
Код:
Func Play()
   For $i=1 to 2
	   $vb = $i
	   ; ...
 
Автор
K

Krokodile

Новичок
Сообщения
43
Репутация
1
у меня справка от 2012.02.12 стоит. Там вообще нет пункта Замечание.
 
Верх