integer - самый простой тип данных. Jass использует 32-битные целочисленные, которые представляются путём парной арифметики (я сам не понял, что есть two's-complement, может, кто подскажет?), в общем, это то же самое, что и long на языке программирования С.
Примеры целочисленных:
Code
local integer a = 5 // 5
local integer b = 2+3 // 5
local integer c = a+3 // 8
local integer d = 19/10 // 1
local integer e = R2I(19.0/10.0) // 1
local integer f = S2I("5") // 5
local integer g = 010 // 8
local integer h = 0x10 // 16
local integer i = 'a' // 97
local integer j = 'abcd' // 1633837924
local integer b = 2+3 // 5
local integer c = a+3 // 8
local integer d = 19/10 // 1
local integer e = R2I(19.0/10.0) // 1
local integer f = S2I("5") // 5
local integer g = 010 // 8
local integer h = 0x10 // 16
local integer i = 'a' // 97
local integer j = 'abcd' // 1633837924
Переменная d - пример деления. Jass отбрасывает дробную часть, когда одну целочисленную делит на другую.
Переменная e - Пример деления реальных (подробнее об этом ниже) и конвертации результата в целочисленную через R2I.
Переменная f - Конвертация строки через S2I.
Переменная g - Восьмеричное число.
Переменная h - Шестнадцатеричное число (или просто хекс).
Переменная i - Символ ASCII или 256-ричное число.
Переменная j - Комбинация четырёх ASCII символов. Известна больше как равкод.
Немного о равкодах. Если в GUI они имеют персональные типы "Тип объекта" и "Способность", то в Jass это простые, обычные числа. К примеру, равкод 'hfoo'. Значения в ASCII его символов такие: 'h', 'f' и 'o' равны 104 (0x68), 102 (0x66) и 111 (0x6F) соответственно.
Давайте рассмотрим несколько методов конвертации равкода в десятичное число.
Способ 1. Просто заменить каждый символ равкода на его шестнадцатеричный аналог. В примере получим 'hfoo' = 0x68666F6F, при конвертации в десятичную систему получим 1751543663.
Способ 2. Если с хексом у вас беда, просто сразу переведите в десятичную систему из 256-ричной. В примере 1751543663=((104*256+102)*256+111)*256+111.
real. Jass использует 32-битные floating points (тоже скажите мне корректный перевод Оо)для этого типа переменных - они эквивалентны типу float на языке программирования C. Поддерживается до трёх символов - выражение 0.0001 == 0.00 всегда вернёт true.
Примеры реальных:
Code
local real a = 5.00 // 5.000
local real b = 5. // 5.000
local real c = S2R("5.0") // 5.000
local real d = I2R(5) // 5.000
local real e = 5 // 5.000
local real f = 19/10 // 1.000
local real g = 19./10. // 1.900
local real b = 5. // 5.000
local real c = S2R("5.0") // 5.000
local real d = I2R(5) // 5.000
local real e = 5 // 5.000
local real f = 19/10 // 1.000
local real g = 19./10. // 1.900
Переменная c - пример конвертации строк через S2R.
Переменная d - пример конвертации целочисленной через I2R.
Переменная e - то же самое, что и переменная d, но конвертация неявная. Поэтому использование 5. по сравнению с 5 намного лучше, так как второе работает медленнее (требует конвертации).
Переменная f - такая же неявная конвертация целочисленных (и 19 и 10 - целочисленные, у них нет точки. Парсер сначала сделает деление целочисленных, затем сконвертирует в real).
Переменная g - надлежащий способ деления реальных.
string. На языке программирования C все строки являются по сути массивами символов, а тип string - указатель на первый символ в этом массиве. Строки в Jass немного сложнее - принцип указателя на первый символ остался, но настоящими указателями служат индексы во внутренней таблице строк. Поэтому строки в Jass могут считаться смарт-указателями.
Каждая строка, которую вы используете, должна быть размещена и записана где-то в памяти. Но если одна строка нужна более одного раза, то выделять на неё больше памяти неразумно, так как она уже где-то в ней есть. Таблица строк может гарантировать, что у вас никогда не будет двух одинаковых строк, записанных в память. Ниже даны примеры строк, а также пометки, когда память размещает их, а когда использует существующие строки.
Code
local string a = "foo" // "foo" рамещена
local string b = "bar" // "bar" размещена
local string c = "foobar" // "foobar" размещена
local string d = a+b // "foobar" использована
local string e = I2S(50) // "50" размещена
local string f = "50" // "50" использована
local string b = "bar" // "bar" размещена
local string c = "foobar" // "foobar" размещена
local string d = a+b // "foobar" использована
local string e = I2S(50) // "50" размещена
local string f = "50" // "50" использована
Таким образом, переменных 6, а размещённых строк - 4.
boolean в Jass 32-битная, хотя в большинстве случаев её значение может быть true (1) или false (0). Условие такого типа:
Code
if (boolvar) then
call BJDebugMsg("yes")
else
call BJDebugMsg("no")
endif
call BJDebugMsg("yes")
else
call BJDebugMsg("no")
endif
будет показывать "yes", если логическая boolvar будет иметь значение, не равное 0. Тем не менее, фильтр boolexpr будет считать как true только значение, равное 1. Из-за этого до патча 1.24 существовала ошибка с функцией IsUnitType, которая в некоторых случаях вместо 1 возвращала 64 и прочие не равные 1 числа.
code - тип данных, используемый для сохранения ссылок на функции и, скорее всего, является 32-битной целочисленной. Так как тип используется очень редко, известно о нём очень мало. Он используется в нескольких функциях, таких как TimerStart и ForGroup. Также это единственный известный тип, который не может быть использован в массиве.
handle - это 32-битный целочисленный смарт-указатель на объект. Это примитивный тип, от которого наследуются все прочие не описанные в этой статье типы данных. Сам тип почти вообще в Jass не использован - common.j не содержит ни одной native-функции, которая бы принимала или возвращала handle. Исключение из этого правила лишь одно - известная функция GetHandleId, официальный наследник неофициальной H2I.
Известно, что Jass применяет подсчёт ссылок, благодаря чему ссылки на уничтоженные объекты могут быть использованы позднее. Именно поэтому все локальные переменные типа handle и всех тех типов, которые от него наследуются, должны быть заданы как null.