Что нового

[Ошибки] Использования переменных в теле скрипта которые обьявленны в функции.

Heler

Знающий
Сообщения
70
Репутация
11
Привет! Вот простенький пример, при запуске которого получаю еррор:

Variable used without being declared.:
Case $hButton_2
Case ^ ERROR


Код:
#include <GuiConstants.au3>
Local $hGui = GUICreate("----", 343, 150, 307, 195)
Local $hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
GUISetState()
While 1
	$msg = GUIGetMsg()
		Switch $msg
			Case $hButton_1
				SomeFunc()
			Case $hButton_2
				GUICtrlCreateButton("=", 130, 30, 90, 90, 0)
			Case $GUI_EVENT_CLOSE
				Exit
		EndSwitch
WEnd

Func SomeFunc()
	Global $hButton_2 = GUICtrlCreateButton("-", 245, 30, 90, 90, 0)
Endfunc


Получалось исправить ситуацию объявив "Global $hButton_2 = 3" в начале скрипта. Скорее всего ето не верный путь решения. Хотелось бы знать как должно быть правильно. :smile:
P.S. И объясните пожалуйста, какой плюс от использования переменных Local. Почему бы не объявлять переменную Global в начале скрипта, и пользоватся ею везде?
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Код:
#include <ButtonConstants.au3>
#include <GuiConstants.au3>
$hGui = GUICreate("----", 343, 150, 307, 195)
$hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
$hButton_2 = GUICtrlCreateButton("-", 245, 30, 90, 90,$BS_NOTIFY)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg()
        Switch $msg
            Case $hButton_1
                SomeFunc()
            Case $hButton_2
                GUICtrlCreateButton("=", 130, 30, 90, 90,Default)
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
WEnd

Func SomeFunc()
     Global $hButton_2 = GUICtrlCreateButton("-", 245, 30, 90, 90,Default)
Endfunc

Ты пытаешься использовать вызов необъявленной кнопки, попробуй ее просто скрыть а потом при выборе отобразить...
 

ynbIpb

Скриптер
Сообщения
399
Репутация
109
ну да, функция ещё не сработала, соответственно кнопка не создалась, а ты уже опрашиваешь.
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
За кнопки спасибо. А с переменными мне как поступать? Объявлять все переменные, которые буду использовать где либо, в верху скрипта с типом Global ?
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Heler
Я думаю, что самое главное, чтобы значение переменной было доступно везде, где ты ее вызываешь...
Но это только с точки зрения "лишь бы работало"...
Если посмотреть с точки зрения логики скрипта, оптимальности скрипта, универсальности скрипта, то, прежде, чем объявить переменную, надо серьезно поразмышлять, где и как будет изменяться и считываться значение переменной... :smile:
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
Я объявил 2 переменные Global $iA и Local $iB. И обе могу использовать не в функциональной области видимости(в функции). Почему так?

Код:
#include <GuiConstants.au3>
$hGui = GUICreate("----", 343, 150, 307, 195)
Local $hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
Global $iA = 11
Local  $iB = 22
GUISetState(@SW_SHOW)

While 1
   Local $msg = GUIGetMsg()
        Switch $msg
            Case $hButton_1
                SomeFunc()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
WEnd

Func SomeFunc()
	MsgBox(4096,"",$iA)
	MsgBox(4096,"",$iB)
Endfunc
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Heler
Если переложить переменные внутрь функции, ситуация изменится...
Переменная, объявленная как Global будет видна вне функции, а переменная, объявленная как Local будет видна только внутри функции...
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
Все верно, работает так как Вы и сказали. Но если я буду объявлять в функции переменную Global и использовать в теле скрипта (в цикле, после запуска етой самой функции) получу варнинг:
WARNING: $iA: possibly used before declaration.

Код:
#include <GuiConstants.au3>
$hGui = GUICreate("----", 343, 150, 307, 195)
Local $hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
GUISetState(@SW_SHOW)

While 1
   Local $msg = GUIGetMsg()
        Switch $msg
            Case $hButton_1
                SomeFunc()
				MsgBox(4096,"",$iA)
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
	WEnd
	
Func SomeFunc()
	Global $iA = 11
Endfunc


Тогда как мне поступить в ситуации где мне нужно работать с переменной везде? И опрашивать ее в цикле.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Heler
У меня твой скрипт отрабатывает без ошибки...
MsgBox выводит 11...
Может проблема версий AUTOIT?
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
Код:
>Running AU3Check (1.54.14.0)  from:C:\Program Files (x86)\AutoIt3
C:\Users\Heler\Desktop\789.au3(11,35) : WARNING: $iA: possibly used before declaration.
MsgBox(4096,"",$iA)
У Вас какая версия утилиты AU3Check? Моя - 1.54.14.0 .
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Heler
AutoIt3 Syntax Checker v1.54.8 Copyright (c) Tylo 2007


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

Однако это всего лишь предупреждение (WARNING)...
Это не ошибка...


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

Наверное, чекеру было сложно найти спрятанную внутрь функции переменную... :smile:
Или я чего-то не понимаю...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 264
Репутация
2 352
snoitaleR [?]
чекеру было сложно найти спрятанную внутрь функции переменную...

Или я чего-то не понимаю...
Видимо не понимаешь что чекер не просто так выводит предупреждение, этому есть причина. Глобальные переменные следует объявлять глобально, точка (возьмите это как правило).
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
CreatoR [?]
Глобальные переменные следует объявлять глобально, точка (возьмите это как правило).
Вот и я о чем говорил, где-то тут в форуме, где ты меня поправил, что можно объявлять, когда я писал, что можно НО! нежелательно, что глобально можно объявить внутри функции но лучше это сделать сразу перед основным исполнительным кодом скрипта...
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
Кнопки:
Если нам нужно при выполнении функции ставить кнопку, то мы ее создаем вверху скрипта и выключаем. Потом в нужном месте просто включим.

Переменные:
Вверху скрипта пишем Opt("MustDeclareVars", 1).
а) Если переменная будет использоватся только локальной/функциональной области видимости, то задаем ей тип Local.
б) Если нам нужно использовать переменную в теле скрипта и в функции то объявляем ее вверху с типом Global.

Я все правильно понял?
 
Верх