Что нового

Переменная, или константа?

AutoLove

Новичок
Сообщения
23
Репутация
1
Я решил начать изучение AI с разбора конкретных примеров. Конкретные примеры для начала извлекаю из переведённого хэлпа "AutoIt3_2_5_4". На определённом этапе у меня возник вопрос: где обычные переменные, а где константы (вроде бы так их обозвали)? И как их различать? Поясню на, опять же, конкретном примере:
#include <GUIConstants.au3>
#include <IE.au3>

_IEErrorHandlerRegister ()

$oIE = _IECreateEmbedded ()
GUICreate("Embedded Web control Test", 640, 580, _
(@DesktopWidth - 640) / 2, (@DesktopHeight - 580) / 2, _
$WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS)
$GUIActiveX = GUICtrlCreateObj($oIE, 10, 40, 600, 360)
$GUI_Button_Back = GUICtrlCreateButton("Back", 10, 420, 100, 30)
$GUI_Button_Forward = GUICtrlCreateButton("Forward", 120, 420, 100, 30)
$GUI_Button_Home = GUICtrlCreateButton("Home", 230, 420, 100, 30)
$GUI_Button_Stop = GUICtrlCreateButton("Stop", 340, 420, 100, 30)

GUISetState() ;Show GUI

_IENavigate ($oIE, "http://www.autoitscript.com")

; Waiting for user to close the window
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $GUI_Button_Home
_IENavigate ($oIE, "http://www.autoitscript.com")
Case $msg = $GUI_Button_Back
_IEAction ($oIE, "back")
Case $msg = $GUI_Button_Forward
_IEAction ($oIE, "forward")
Case $msg = $GUI_Button_Stop
_IEAction ($oIE, "stop")
EndSelect
WEnd

GUIDelete()

Exit



Красным цветом отмечены элементы, происхождение которых для меня остается тайной. Зелёным выделены те, которые мне таки удалось найти в справке, ибо поиск в интернете выдает огромное число страниц с кусками кода, где они присутствуют, но не объясняется их происхождение.

Я бы был безмерно счастлив если бы мне дали список, или путь к списку всех этих констант)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Переменная, это просто именованная область памяти. Название для нее ты волен выбирать сам, в рамках синтаксиса языка, напрмер:

Код:
$MyVar = 5


Но крайне желательно придерживаться общих рекомендаций для названий переменных. В этом случае, правельнее было бы написать так:

Код:
$iMyVar = 5


Хорошим стилем программирования считается определение всех переменных до того, как они будут использованы. Для этого существует зарезервированные слова "Global" и "Local". Первое применяется в рамках всего кода, второе, только внутри функций, например:

Код:
Global $iMyVar

...

$iMyVar = 5

...

Func _MyFunc()
	
	Local $iMyLocalVar
	
	...
	
	$iMyLocalVar = 1
	
	...
	
EndFunc   ;==>_MyFunc


Здесь переменная $iMyLocalVar будет доступна только внутри функции _MyFunc(), и будет уничтожена после завершения этой функции. $iMyVar доступна в любом месте кода, в том числе и внутри любых функциий, и будет существовать до окончания работы программы. Также допускается инициализация переменных при их объявлении:

Код:
Global $iMyVar = 5


или

Код:
Func _MyFunc()
	
	Local $iMyLocalVar = 1
	
	...
	
EndFunc   ;==>_MyFunc


В AutoIt можно и не объявлять заранее переменные, т.е. не писать "Global" или "Local". В этом случае, переменная будет создана при первом обращении к ней:

Код:
$iMyVar = 5 ; <= Здесь будет создана переменная с именем $iMyVar
$iMyVar += 1
ConsoleWrite("$iMyVar = " & $iMyVar & @CR)


Но как я уже сказал ранее, это не есть хорошо. При относительно большом коде, запутаться в нем случае будет очень легко.

Константа отличается от переменной, только тем, что после ее объявления и присвоения какого-либо значения, изменить в дальнейшем его (значение) будет уже нельзя. Для объявления констант служит зарезервированное слово "Const":

Код:
Global Const $iMyConst = 5

...

$iMyConst = 1 ; <= Здесь будет ошибка!


Также, как и в случае с переменными, константы могут быть как глобальными, так и локальными, смысл тот же.

В твоем примере, $oIE, $GUI_Button_Back и т.д. (только красного цвета, а не желтого, как ты написал) являются обычными переменными, и при желании, ты можешь изменить их названия на свой вкус. $WS_OVERLAPPEDWINDOW и др., есть константы, которые были объявлены в файле WindowsConstants.au3:

Код:
...

Global Const $WS_OVERLAPPEDWINDOW = 0x00CF0000
Global Const $WS_CLIPSIBLINGS = 0x04000000
Global Const $WS_VISIBLE = 0x10000000

...


Вот и все.

:smile:

P.S
На нашем форуме, AutoIt код принято заключать в тэг [autoit] -
.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
1. я наверное ослеп, но не нашел ни одной желтой надписи :smile:
2. ты пользуешься не самой удачной версией справки - русской. она очень старая. лучше актуальную - английскую.
3. если желтое все таки красное, то это переменные. константы обозначены в файле GUIConstants.au3 (кстати, теперь надо вместо нее подключать библиотеку GUIConstantsEx.au3). все библиотеки находятся в папке %ProgramFiles%\AutoIt3\Include
 
Автор
A

AutoLove

Новичок
Сообщения
23
Репутация
1
большое спасибо за детальный ответ)



P. S. В моем посте красное в самом деле желтое, и наоборот) Просто я сначала выделил желтым, а на предварительном просмотре он показался мне не удобным для чтения - сливался со светлым фоном форума, поэтому я решил исправить его на красный (который, как мне поначалу показалось, будет слишком резать глаза - на деле же вышло, что красный этого форума очень даже приятно читается). Вот и забыл исправить в итоге)

P. S.2
На нашем форуме, AutoIt код принято заключать в тэг
Код:
[/quote]
буду исправляться)
 
Автор
A

AutoLove

Новичок
Сообщения
23
Репутация
1
и ещё вопрос в догонку:
после запуска вышеприведённого примера появляется ошибка, которая требует объявления переменных (хотя это константы)
"$WS_OVERLAPPEDWINDOW, $WS_VISIBLE, $WS_CLIPSIBLINGS".

Можно ли этого избежать?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
AutoLove сказал(а):
Можно ли этого избежать?
Как сказал ранее Kaster, ты используешь устаревшую справку. Удали ее! :smile: В твоем коде нужно заменить секцию с "#Include" на следующую:

Код:
#Include <GUIConstantsEx.au3>
#Include <IE.au3>
#Include <WindowsConstants.au3>
 
Автор
A

AutoLove

Новичок
Сообщения
23
Репутация
1
спасибо)

есть более новые версии справки на русском? А то с английским не очень дружу и продвижение по справке под руку со словарём значительно снижает темп)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
AutoLove
нет. есть ребята, которые на голом энтузиазме этим занимаются, но в виду ограниченных человеческих ресурсов неясно, когда эта справка выйдет на свет. так что, учи английский :smile:
 
Верх