Примитивные типы данных в Jass - Форум


Правила форума ·

  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Warcraft III » Библиотека » Примитивные типы данных в Jass
Примитивные типы данных в Jass

[DUОS]

#1
В информатике примитивным называется тип, который является базовым для языка программирования. В Jass таких типов шесть - integer, real, string, boolean, code и handle.

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


Переменная 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


Переменная 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" использована

Таким образом, переменных 6, а размещённых строк - 4.
boolean в Jass 32-битная, хотя в большинстве случаев её значение может быть true (1) или false (0). Условие такого типа:
Code
if (boolvar) then
     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.
Школа - это место, где шлифуют булыжники и портят алмазы. © Роберт Ингерсолл

KO3bMA

#2
Simplar, ваще канеш интересно вот что, гуи это имхо жасс в удобной для нубов типа меня форме, а кто нить из крутых программеров подумал о каком нить компиляторе в жас, кроме близзовского перевести в текст?, это бы существенно оптимизировало мапу,имхо

Edgus

#4
Simplar, хмм... Наименования данных знакомые. Сейчас прохожу курс программирования на VBA. Integer, String и Boolean по крайней мере часто используются. Интересно, если поучусь подольше в программировании, проще ли будет колдовать в Jass'e? happy
Сообщение отредактировал Edgus - Пт, 23.09.11, 20:53

Spirit_of_Dragon

#5
Quote (Edgus)
Интересно, если поучусь подольше в программировании, проще ли будет колдовать в Jass'e? happy

да, определённо
в jass есть все типы из обычных языков программирование, хотя имеются и свои типы
а некоторые представляются в несколько другом виде

Добавлено (23.09.11, 21:03)
---------------------------------------------

Quote (Simplar)
string. На языке программирования C все строки являются по сути массивами символов, а тип string - указатель на первый символ в этом массиве.

Тип string представляет последовательность из нуля или более символов в кодировке Юникод. Тип string — это псевдоним для типа String платформы .NET Framework.

Несмотря на то, что тип string является ссылочным типом, операторы равенства (== и !=) определены для сравнения значений объектов типа string, а не ссылок. Это упрощает проверку равенства строк. (с) MSDN

[DUОS]

#6
Quote (KO3bMA)
кто нить из крутых программеров подумал о каком нить компиляторе в жас, кроме близзовского перевести в текст?

Ты про то, чтобы переписать компилятор близзов?
Школа - это место, где шлифуют булыжники и портят алмазы. © Роберт Ингерсолл

Spirit_of_Dragon

#7
а, не. это в c# так. в c++ string - массив char'ов

Добавлено (23.09.11, 21:06)
---------------------------------------------

Quote (Simplar)

Ты про то, чтобы переписать компилятор близзов?

jasshelper? не?

[DUОS]

#8
Quote (Spirit_of_Dragon)
Тип string представляет последовательность из нуля или более символов в кодировке Юникод. Тип string — это псевдоним для типа String платформы .NET Framework.

Несмотря на то, что тип string является ссылочным типом, операторы равенства (== и !=) определены для сравнения значений объектов типа string, а не ссылок. Это упрощает проверку равенства строк. (с) MSDN

Хммм, == и != да, тоже имеется такое.
Школа - это место, где шлифуют булыжники и портят алмазы. © Роберт Ингерсолл

[DUОS]

#9
Quote (Spirit_of_Dragon)
jasshelper? не?

JassHelper - средство JNGP вроде.
Школа - это место, где шлифуют булыжники и портят алмазы. © Роберт Ингерсолл

KO3bMA

#10
Quote (Simplar)
Ты про то, чтобы переписать компилятор близзов?
ога, ну то есть свой какой нить, штоб мапа сделанная юзером на гуи,после компилирования была на жасс )

[DUОS]

#11
Quote (KO3bMA)
мапа сделанная юзером на гуи,после компилирования была на жасс )

Так Anti-Leaks Library изобрели уже.
Школа - это место, где шлифуют булыжники и портят алмазы. © Роберт Ингерсолл

KO3bMA

#12
Quote (Simplar)
Так Anti-Leaks Library изобрели уже.

то есть я чо та там сочинил, применил Anti-Leaks Library, открываю мапу и она вся на жасс?, круто, не знал даже )
а стоит пользоваться?

H_A_PK

#14
прикрепил, Дуос молодец
Ползут 2 пирожка.
Первый: Я тебя щас трахну.
Второй: Почему?
Первый: Потому что я с яйцами :D
Форум » Warcraft III » Библиотека » Примитивные типы данных в Jass
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: