Что нового

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

Belfigor

Модератор
Локальный модератор
Сообщения
3,603
Репутация
941
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,603
Репутация
941
Зарезервированный пост, очень прошу не удалять. В него потом я скопирую первое сообщение, а в первом останется только готовая отформатированная справочная информация.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,463
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,603
Репутация
941
Спасибо, допишу свой крипт, отредактирую первое сообщение в полноценную справку :smile:
 

CreatoR

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





























Тут Якорь
 

Yashied

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

:smile:
 

CreatoR

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

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

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