Что нового

Вопрос по "Рекомендациям использованию имен переменных в скриптах"

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
CreatoR сказал(а):
В Autoit существует только один тип данных - Variant , поэтому для удобства написания скриптов рекомендуется использовать следующие имена переменных:

Первый набор символов после знака доллара ($) должен определять тип данных. Следующий список определяет префиксы и типы данных используемы с ними:

* $a<символ> - (Array) Массив данных - последующий символ взятый из списка ниже, определяет тип данных в массиве
* $b - (Binary data) Двоичные данные
* $h - (File or window handle) Дескриптор файла, окна, и т.д.
* $i - (Integer) Целое число
* $f - (Boolean) Логический тип, может принимать значения True или False
* $n - (Floating point number) Число с плавающей точкой
* $s - (String) Строка
* $v - (Variant) Вариант, неопределенный тип данных, базовый тип для Autoit
* $t - (Struct) Структура в стиле C/C++, для использования в DllCall, в сообщениях WM_*, при обработке данных и т.п.
* $p - (Pointer) Указатель на структуру или на её элемент

Остальное имя переменной следует начинать с заглавной буквы, и оно должно отражать функциональность (свойства) переменной. Имена вроде “$iC” не приемлемы.
"$aiWeekDayNames" или "$iCounter" намного предпочтительнее.

Переведено с «User Defined Functions Standards».

P.S
От себя...
Такая манера написания скриптов уже стала почти стандартом среди AutoIt-кодеров, оно придаёт коду более читабельный и приятный вид.
Я полон решимости перейти от написания не красивого треш кода к общепринятым стандартам оформления названий функций и переменных. В свете этого хотелось бы уточнить и получить конкретные примеры относительно приведенных ниже вопросов. И так, мое понимание выше приведенной цитаты на данный момент:

* $a<символ> Array - Массив данных.
По обще принятым стандартым в коде он должен выглядить следующим образом: $aArray. Пример:
Код:
Dim $aArray[2] = [0,1]
Dim $aSearchArea[4] = [25,25,50,50]


* $b - Двоичные данные
Вопрос: Не имею представления что должно храниться переменных данного типа. Хотелось бы получить развернутый ответ с примером того что должно в этом типе переменных храниться.

* $h - Дескриптор файла, окна, и т.д.
Выглядеть в коде должен так: $hWnd - заголовок окна. Пример:
Код:
Local $hWnd = WinGetHandle("[CLASS:Notepad]")

Вопрос: какие типы дескрипторов еще существуют и как их получить. Желательно несколько примеров.

* $i - Целое число
Ну... Целое число оно везде целое число. Выглядеть в коде должно так:
Код:
$iSomeNumber1 = 43
$iSomeNumber2 = 34


* $f - Логический тип, может принимать значения True или False
Как я понимаю в переменные данного типа мы присваиваем ссылки на функции которые возвращают значения True or False. Или же только те переменные в которые мы напрямую вложили одно из этих значений? В коде должно выглядеть так:
Код:
$fSituation1 = True
$fSituation2 = False
$fSituation3 = Test1()
$fSituation4 = Test2()
Func Test1()
    Return True
EndFunc
Func Test2()
    Return False
EndFunc


* $n - Число с плавающей точкой
Прошу разъяснить все по данному пункту. Предполагаю как должно выглядеть в коде:
Код:
$nSomeNumber = 123.3456


* $s - Строка
набор символов заключенный в кавычки. В коде должно выглядеть так:
$sMsg = "Some Text"

* $v - Вариант, неопределенный тип данных, базовый тип для Autoit
Прошу разъяснить все по этому пункту.

* $t - Структура в стиле C/C++, для использования в DllCall, в сообщениях WM_*, при обработке данных и т.п.
Прошу разъяснить все по этому пункту.

* $p - (Pointer) Указатель на структуру или на её элемент
Прошу разъяснить все по этому пункту.


P.S. К каким типам данных относятся данные получаемые из команд PixelGetColor и PixelSearch?
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Зарезервированный пост, очень прошу не удалять. В него потом я скопирую первое сообщение, а в первом останется только готовая отформатированная справочная информация.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Belfigor [?]
* $b - Двоичные данные
Вопрос: Не имею представления что должно храниться переменных данного типа.
Бинарные данные.

Хотелось бы получить развернутый ответ с примером того что должно в этом типе переменных храниться.
Код:
$hFile = FileOpen("File.txt", 16)
Dim $aArray[2] = [0, FileRead($hFile)]


* $h - Дескриптор файла, окна, и т.д.
Выглядеть в коде должен так: $hWnd - заголовок окна. Пример:
...
Вопрос: какие типы дескрипторов еще существуют и как их получить. Желательно несколько примеров.
Код:
$hWnd = WinGetHandle()
$hFile = FileOpen()
$hDll = DllOpen()
$hCallback = DllCallbackRegister()


* $f - Логический тип, может принимать значения True или False
Как я понимаю в переменные данного типа мы присваиваем ссылки на функции которые возвращают значения True or False. Или же только те переменные в которые мы напрямую вложили одно из этих значений?
Значения True или False (может возвращаться функцией). Не как строка ("False" уже считается строкой - $s).

* $n - Число с плавающей точкой
Прошу разъяснить все по данному пункту. Предполагаю как должно выглядеть в коде:
Всё верно. Хотя $n и $i используются почти одинаково, многие не обращают внимание на различие, и даже часто для созданного элемента, который возвращает идентификатор (целое число), пишут через $nCtrl.

* $s - Строка
набор символов заключенный в кавычки. В коде должно выглядеть так:
$sMsg = "Some Text"
Да, но может считываться и из внешних источников (файл).

* $v - Вариант, неопределенный тип данных, базовый тип для Autoit
Прошу разъяснить все по этому пункту.
Что именно? это используется при неопределённом типе данных. Пример:
Код:
Dim $avArray[3] = [2, "String", 12345]


* $t - Структура в стиле C/C++, для использования в DllCall, в сообщениях WM_*, при обработке данных и т.п.
Прошу разъяснить все по этому пункту.
Что разъяснить? Ты конкретно спрашивай, хотя ты и так сам понял что это означает - структура, блок данных, кстати может использоваться как врапер для парсинга строк, быстрее и больше возможностей (подробнее сходу описать не получится).

* $p - (Pointer) Указатель на структуру или на её элемент
Прошу разъяснить все по этому пункту.
Тоже, это указатель на структуру. Разъяснение этих типов уже не входит в “должность/назначение” данной темы (рекомендации по написанию переменных).
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Спасибо, допишу свой крипт, отредактирую первое сообщение в полноценную справку :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
OffTopic:
Belfigor [?]
отредактирую первое сообщение в полноценную справку
Кстати для этого есть тег якоря, который можно использовать как ссылку на разные части сообщения.





























Тут Якорь
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Начну с конца (так удобнее). :smile:

Belfigor сказал(а):
P.S. К каким типам данных относятся данные получаемые из команд PixelGetColor и PixelSearch?
$aCoord = PixelSearch(...) - Массив
$iColor = PixelGetColor(...) - Целочисленное значение

Belfigor сказал(а):
* $t - Структура в стиле C/C++, для использования в DllCall, в сообщениях WM_*, при обработке данных и т.п.
Прошу разъяснить все по этому пункту.

* $p - (Pointer) Указатель на структуру или на её элемент
Прошу разъяснить все по этому пункту.
$tStruct = DllStructCreate(...) - Структура
$pStruct = DllStructGetPtr($tStruct) - Указатель на структуру (в данном случае $tStruct)

Belfigor сказал(а):
* $v - Вариант, неопределенный тип данных, базовый тип для Autoit
Прошу разъяснить все по этому пункту.
Не имеет особого смысла, забей.

Belfigor сказал(а):
* $n - Число с плавающей точкой
Прошу разъяснить все по данному пункту. Предполагаю как должно выглядеть в коде:
Все правильно.

Belfigor сказал(а):
* $f - Логический тип, может принимать значения True или False
Как я понимаю в переменные данного типа мы присваиваем ссылки на функции которые возвращают значения True or False. Или же только те переменные в которые мы напрямую вложили одно из этих значений? В коде должно выглядеть так:
Здесь сложнее. Все эти обозначения - условность. И сделано это только для облегчения понимания кода. Т.е., если ты в коде видишь переменную с названием $fSituation1, то это теоретически должно означать, что эту переменную мы будем использовать для проверки на False (0 - нуль) или True (все остальное). Но ничто не мешает этой переменной иметь значение 666, "WOW" или -1.76. А все потому, что в AutoIt все переменные - Variant (может быть любого типа).

Belfigor сказал(а):
Вопрос: какие типы дескрипторов еще существуют и как их получить. Желательно несколько примеров.
$h... - это означает указатель (Handle) на любой объект, не обязательно только окна. Например:

$hFile = _WinAPI_CreateFile(...)
$hBitmap = _WinAPI_CreateBitmap(...)
$hDC = _WinAPI_GetDC(...)

С точки зрения этих обозначений следующая запись является неверной.

$hFile = FileOpen(...)

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

$iFile = FileOpen(...)

но в этом слючае может возникнуть путаница, и поэтому на это все забили и пишут $hFile. И это хорошо.

:smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
CreatoR сказал(а):
...кстати может использоваться как врапер для парсинга строк, быстрее и...
Здесь я думаю ты не прав. Работа со структурами намного медленнее, чем аналогичное решение с использованием родных String...() функций. Возможностей - да, больше, но они все сильно ограничены. Вообщем структуры лучше применять для того, для чего они и были предназначены - DllCall(). Даже название говорит само за себя. И желательно их использовать непосредственно перед вызовом DllCall(), а не хранить в них данные, ака массив. Хотя, ...при разумном подходе... Вот прикольный пример использования структур не по назначению:

Код:
Func _Hex64($iValue, $iLenght = 16)

    Local $tStruct1, $tStruct2

    $tStruct1 = DllStructCreate('int64')
    DllStructSetData($tStruct1, 1, $iValue)
    $tStruct2 = DllStructCreate('int;int', DllStructGetPtr($tStruct1))
    Return StringRight(StringFormat('%016s', Hex(DllStructGetData($tStruct2, 2)) & Hex(DllStructGetData($tStruct2, 1))), $iLenght)
EndFunc   ;==>_Hex64


:smile:
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Yashied сказал(а):
$tStruct = DllStructCreate(...) - Структура
$pStruct = DllStructGetSize($tStruct) - Указатель на структуру (в данном случае $tStruct)
не знаю принято или нет, но я практикую ещё так:

$zStruct = DllStructGetSize($tStruct) - Размер структуры (хотя это целое число)

Belfigor сказал(а):
* $v - Вариант, неопределенный тип данных, базовый тип для Autoit
Прошу разъяснить все по этому пункту.
смысл в том, что переменной разрешено быть нескольких типов, пример: параметр функции ProcessExists() может быть целым числом или строкой

Yashied сказал(а):
Все эти обозначения - условность.
не условность, сравните результат: IsBool(False) и IsBool(0)
;)

Yashied сказал(а):
А все потому, что в AutoIt все переменные - Variant (может быть любого типа).
я вижу смысл Variant в другом: AutoIT по ходу выполнения скрипта сам решает, к какому (внутреннему) типу данных привести переменную... иногда такое поведение AutoIT надо корректировать, для этого и предусмотрены функции явного задания типов: Int(), Number(), String(), HWnd(), Binary(), Ptr()

Belfigor сказал(а):
Вопрос: какие типы дескрипторов еще существуют и как их получить. Желательно несколько примеров.
тут можно посмотреть, с указанием ф-ций открытия/закрытия: Kernel Objects

Yashied сказал(а):
но в этом слючае может возникнуть путаница, и поэтому на это все забили и пишут $hFile.
по своему смыслу $hFile - именно описатель, так как требует открытия, закрытия и контроля со стороны скриптера, это совсем не обязательно описатель объектов ядра, могут быть описатели AutoIT, можно даже самому ввести свои описатели
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
amel27 сказал(а):
не условность, сравните результат: IsBool(False) и IsBool(0)
Речь идет про обозначения, а не их значения. А TRUE и FALSE вообще изначально не было в AutoIt.

Код:
$hObject = DllCall(...)
$hObject = $hObject[0]
...
If @error Then
    $hObject = -1
EndIf


Также можно почитать это.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Yashied сказал(а):
Вот прикольный пример использования структур не по назначению
почему не по назначению?.. в СИ такому использованию соответствуют объединения (union)

Yashied сказал(а):
Речь идет про обозначения, а не их значения.
дык вот и надо определить по какому признаку обозначать - по применению (как у описателей), либо по типу данных (как у чисел), так как обрабатываться оба случая в скрипте могут по разному:
Код:
_CMP (1, True)
_CMP (0, False)

Func _CMP ($v1, $v2)
	ConsoleWrite("-Binary-"&@CRLF&"v1:"& Binary($v1) &@CRLF&"v2:"& Binary($v2) &@CRLF)
	ConsoleWrite("--Int---"&@CRLF&"v1:"& Int($v1)    &@CRLF&"v2:"& Int($v2)    &@CRLF)
	ConsoleWrite("-Number-"&@CRLF&"v1:"& Number($v1) &@CRLF&"v2:"& Number($v2) &@CRLF)
	ConsoleWrite("-String-"&@CRLF&"v1:"& String($v1) &@CRLF&"v2:"& String($v2) &@CRLF)
EndFunc
Yashied сказал(а):
А TRUE и FALSE вообще изначально не было в AutoIt
в курсе, только что нам это даёт?.. кстати, может так?
Код:
$aObject = DllCall(...)
$hObject = $aObject[0]
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Yashied сказал(а):
amel27 сказал(а):
...кстати, может так?
А смысл?
CreatoR сказал(а):
Такая манера написания скриптов уже стала почти стандартом среди AutoIt-кодеров, оно придаёт коду более читабельный и приятный вид.
:smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Я думаю так: если в AutoIt используется тип Variant, то нужно это использовать (по обстоятельствам), а не городить кучу ненужных переменных.

:smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Yashied [?]
Здесь я думаю ты не прав. Работа со структурами намного медленнее, чем аналогичное решение с использованием родных String...() функций
На оф. форуме как то делали сравнение скорости обработки, тесты показали что структуры опережают все остальные методы по скорости. Найду ссылку на обзор скину сюда.

[?]
С точки зрения этих обозначений следующая запись является неверной.

$hFile = FileOpen(...)
:blink: А как же возвращаемое значение указанное в справке:
Return Value
Success: Returns a file "handle" for use with subsequent file functions.
Возвращает может и число (как тип данных), но для AutoIt это дескриптор.
 
Верх