Сейчас 04:58:38 Среда, 26 августа, 2026 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Статья] Примитивные типы данных в 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 всегда прав. Не спорь с ним.
 

[DUОS]Дата: Понедельник, 26 Сентября 2011, 20:59:27 | Сообщение # 25
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (Эльфийка)
Статью спер

Ранее в других темах я давал на неё ссылку.


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


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

  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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