Сейчас 18:16:23 Пятница, 19 августа, 2022 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Статья] Примитивные типы данных в Jass
[Статья] Примитивные типы данных в Jass
[DUОS]Дата: Пятница, 23 Сентября 2011, 19:51:34 | Сообщение # 1
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
В информатике примитивным называется тип, который является базовым для языка программирования. В Jass таких типов шесть - integer, real, string, boolean, code и handle.

integer - самый простой тип данных. Jass использует 32-битные целочисленные, которые представляются со знаком арифметики, в общем, это то же самое, что и long на языке программирования С.
Примеры целочисленных:
[code=jass]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
[/code]

Переменная 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-битные числа с плавающей точкой для этого типа переменных - они эквивалентны типу float на языке программирования C. Поддерживается до трёх символов - выражение 0.0001 == 0.00 всегда вернёт true.
Примеры реальных:[code=jass]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
[/code]

Переменная c - пример конвертации строк через S2R.
Переменная d - пример конвертации целочисленной через I2R.
Переменная e - то же самое, что и переменная d, но конвертация неявная. Поэтому использование 5. по сравнению с 5 намного лучше, так как второе работает медленнее (требует конвертации).
Переменная f - такая же неявная конвертация целочисленных (и 19 и 10 - целочисленные, у них нет точки. Парсер сначала сделает деление целочисленных, затем сконвертирует в real).
Переменная g - надлежащий способ деления реальных.
string. На языке программирования C все строки являются по сути массивами символов, а тип string - указатель на первый символ в этом массиве. Строки в Jass немного сложнее - принцип указателя на первый символ остался, но настоящими указателями служат индексы во внутренней таблице строк. Поэтому строки в Jass могут считаться смарт-указателями.
Каждая строка, которую вы используете, должна быть размещена и записана где-то в памяти. Но если одна строка нужна более одного раза, то выделять на неё больше памяти неразумно, так как она уже где-то в ней есть. Таблица строк может гарантировать, что у вас никогда не будет двух одинаковых строк, записанных в память. Ниже даны примеры строк, а также пометки, когда память размещает их, а когда использует существующие строки.
[code=jass]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" использована
[/code]
Таким образом, переменных 6, а размещённых строк - 4.
boolean в Jass 32-битная, хотя в большинстве случаев её значение может быть true (1) или false (0). Условие такого типа:
[code=jass]if (boolvar) then
call BJDebugMsg("yes")
else
call BJDebugMsg("no")
endif[/code]
будет показывать "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.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)


Сообщение отредактировал [DUОS] - Суббота, 24 Сентября 2011, 12:12:43
 

Ty3uKДата: Пятница, 23 Сентября 2011, 21:04:11 | Сообщение # 2
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Дуся, биг спс, узнал кое-что новое :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

ЭльфийкаДата: Пятница, 23 Сентября 2011, 21:44:36 | Сообщение # 3
4 уровень
Группа: Проверенные
Сообщений: 87
Награды: 0
Репутация: 115
Блокировки:
Ty3uK, это не гайд, а вопросы.
Quote (|DUОS|)
представляются путём парной арифметики

А было попросту "со знаком". Кто бы мог подумать?
Quote (|DUОS|)
floating points
- ты умеешь пользоваться гуглом, не лги.
Quote (|DUОS|)
эквивалентны типу float

Неа.
Все вроде.
 

Ty3uKДата: Пятница, 23 Сентября 2011, 22:21:26 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Увы, он не знал :) кинул статью с вики - теперь знает :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

[DUОS]Дата: Пятница, 23 Сентября 2011, 22:38:45 | Сообщение # 5
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (Эльфийка)
Неа.

Ага. float в си = real в jass.
Quote (Эльфийка)
А было попросту "со знаком". Кто бы мог подумать?

Элис, разве?
Quote (Эльфийка)
ты умеешь пользоваться гуглом, не лги.

Умею. Это числа с плавающей точкой.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

DragoNДата: Суббота, 24 Сентября 2011, 00:24:38 | Сообщение # 6
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (|DUОS|)

Ага. float в си = real в jass.

double же в си = real в jass


El Psy Congroo


Сообщение отредактировал DragoN - Суббота, 24 Сентября 2011, 00:27:49
 

SirNikolasДата: Суббота, 24 Сентября 2011, 11:26:14 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Зачем спорить, если можно провести эксперимент?


 

ЭльфийкаДата: Суббота, 24 Сентября 2011, 22:11:38 | Сообщение # 8
4 уровень
Группа: Проверенные
Сообщений: 87
Награды: 0
Репутация: 115
Блокировки:
В С поддерживается более трех символов после запятой.
SirNikolas, учти, что проверять придется именно в C, а не каком то-там C++.

Quote (|DUОS|)
Элис, разве?

Quote (|DUОS|)
которые представляются со знаком арифметики

shok
Русские люди пишут "целый со знаком"
 

FaionДата: Суббота, 24 Сентября 2011, 23:08:05 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Quote (DragoN)
double же в си = real в jass


Нет, float < double(больше значений после запятой).


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

SirNikolasДата: Воскресенье, 25 Сентября 2011, 11:32:28 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Эльфийка, посмотри на расширение исходника. Хотя в C++ типы те же самые.

 

FaionДата: Воскресенье, 25 Сентября 2011, 12:56:56 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
C++ == C + библиотеки по сути.

О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

ЭльфийкаДата: Воскресенье, 25 Сентября 2011, 14:27:43 | Сообщение # 12
4 уровень
Группа: Проверенные
Сообщений: 87
Награды: 0
Репутация: 115
Блокировки:
[DUОS], SirNikolas, Faion, никакие школьные хитрости не помогут вам впихнуть в джассовскую real значения констант FLT_MAX и FLT_MIN.
 

[DUОS]Дата: Воскресенье, 25 Сентября 2011, 15:29:58 | Сообщение # 13
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (Эльфийка)
никакие школьные хитрости не помогут вам впихнуть в джассовскую real значения констант FLT_MAX и FLT_MIN.

Будто ты можешь :-D
Гоу читай, ок.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)


Сообщение отредактировал [DUОS] - Воскресенье, 25 Сентября 2011, 15:34:08
 

ЭльфийкаДата: Воскресенье, 25 Сентября 2011, 18:09:31 | Сообщение # 14
4 уровень
Группа: Проверенные
Сообщений: 87
Награды: 0
Репутация: 115
Блокировки:
Там не написано что такое float в C, т к C описан только и исключительно в ANSI/ISO 9899:1999
Там не написано что такое real в JASS.
Там не написано что float = real.

Дуос согласен, что тип float может принимать, например, значение 0.0001, а тип real не может. И продолжает утверждать своё: типы эквивалентны. Мне он это доказал . Но даже все школьники мира не смогут это доказать компьютеру. Для компа тип данных - множество допустимых значений и способ их представления исполнителем.
 

FaionДата: Воскресенье, 25 Сентября 2011, 18:38:36 | Сообщение # 15
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Quote (Эльфийка)
Faion, никакие школьные хитрости не помогут вам впихнуть в джассовскую real значения констант FLT_MAX и FLT_MIN.


И? Оно мне нужно?

Добавлено (25 Сентябрь 2011, 18:38:36)
---------------------------------------------

Quote (Эльфийка)
float может принимать, например, значение 0.0001, а тип real не может


facepalm real == float ._.


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

tvainДата: Воскресенье, 25 Сентября 2011, 20:08:57 | Сообщение # 16
6 уровень
Группа: Проверенные
Сообщений: 188
Награды: 0
Репутация: 44
Блокировки:
А что тебе здесь нужно? А?
avtortroll Faion == noob
Все как у тебя.
 

FaionДата: Воскресенье, 25 Сентября 2011, 20:37:28 | Сообщение # 17
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Quote (tvain)
Faion != noob

fixed

Бтв, а ты кто?


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL


Сообщение отредактировал Faion - Воскресенье, 25 Сентября 2011, 20:38:10
 

FatalBladeДата: Воскресенье, 25 Сентября 2011, 20:49:03 | Сообщение # 18
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (|DUОS|)
handle - это 32-битный целочисленный смарт-указатель на объект.

ээ..
Вроде 32-битный целочисленный смарт-указатель на объект это как раз integer, а сам обьект это Handle, не?


 

[DUОS]Дата: Воскресенье, 25 Сентября 2011, 21:03:25 | Сообщение # 19
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (Эльфийка)
тип float может принимать, например, значение 0.0001

Никогда не сможет. Ниже 0.001 не сможет. А вот double - другое дело.
Quote (Эльфийка)
типы эквивалентны.

real и float эквивалентны. Я уже сказал выше, почему.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

ЭльфийкаДата: Воскресенье, 25 Сентября 2011, 21:59:12 | Сообщение # 20
4 уровень
Группа: Проверенные
Сообщений: 87
Награды: 0
Репутация: 115
Блокировки:
Согласно ANSI/ISO 9899:1999 §5.2.4.2.2
Минимальное положительное число в бинарном исполнении, которое может принять переменная типа float должно быть меньше 10-37

Quote
The values given in the following list shall be replaced by constant expressions with
implementation-defined (positive) values that are less than or equal to those shown:
— the difference between 1 and the least value greater than 1 that is representable in the
given floating point type, b1-p
FLT_EPSILON 1E-5
DBL_EPSILON 1E-9
LDBL_EPSILON 1E-9
minimum normalized positive floating-point number, bemin-1
FLT_MIN 1E-37
DBL_MIN 1E-37
LDBL_MIN 1E-37

[DUОS], со стандартом невозможно спорить. У него печать и подпись.
А на практике абсолютно все реализации C и C++ воспринимают 0.0001 как отличное от нуля значение хоть float , хоть не float.
 

SirNikolasДата: Понедельник, 26 Сентября 2011, 12:11:00 | Сообщение # 21
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Эльфийка)
Там не написано, что float = real.
Но ведь sizeof(float) == sizeof(real)


 

tvainДата: Понедельник, 26 Сентября 2011, 14:18:14 | Сообщение # 22
6 уровень
Группа: Проверенные
Сообщений: 188
Награды: 0
Репутация: 44
Блокировки:
integer = real

Добавлено (26 Сентябрь 2011, 14:18:14)
---------------------------------------------

Quote (Faion)
real != float

fixed

Бтв, я - про, а ты кто?
 

MaSerДата: Понедельник, 26 Сентября 2011, 14:19:15 | Сообщение # 23
Котобог
Группа: Стримеры
Сообщений: 3574
Награды: 13
Блокировки:
Quote (tvain)
integer = real

Отнюдь, посмотри минимальные/максимальные значения.
Там аналогичный флоату формат, но не флоат.


 

tvainДата: Понедельник, 26 Сентября 2011, 15:30:48 | Сообщение # 24
6 уровень
Группа: Проверенные
Сообщений: 188
Награды: 0
Репутация: 44
Блокировки:
У real и float тоже минимальные/максимальные значения, а real = float. Главное все по 4 байта.
Quote (SirNikolas)
sizeof(integer) == sizeof(real)

SirNikolas всегда прав. Не спорь с ним.
 

ЭльфийкаДата: Понедельник, 26 Сентября 2011, 19:21:55 | Сообщение # 25
4 уровень
Группа: Проверенные
Сообщений: 87
Награды: 0
Репутация: 115
Блокировки:
Статью спер, перевел с ошибками, представил к защите, - и не защитил.
В информатике примитивным называется тип, который является базовым для языка программирования тавталогия.В Jass таких типов шесть - integer, real, string, boolean, code и handle.

integer - самый простой тип данных boolean. Jass использует 32-битные целочисленные, которые представляются со знаком арифметики речевые ошибки, в общем, это то же самое, что и 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-битные числа с плавающей точкой для этого типа переменных - они
эквивалентны типу 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 до уничтожения объектов.
незачет


SirNikolas - троль
Faion - троль
MaSer - нуб
tvain - я
 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Статья] Примитивные типы данных в Jass
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright © 2006 - 2022 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz