Что нового

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

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,724
Переменная, это просто именованная область памяти. Название для нее ты волен выбирать сам, в рамках синтаксиса языка, напрмер:

Код:
$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] -
autoit.gif
.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
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,724
AutoLove сказал(а):
Можно ли этого избежать?

Как сказал ранее Kaster, ты используешь устаревшую справку. Удали ее! :smile: В твоем коде нужно заменить секцию с "#Include" на следующую:

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

AutoLove

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

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

kaster

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