 |
|
 |
|
|
[Статья] Примитивные типы данных в 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
Блокировки: 
| Дуся, биг спс, узнал кое-что новое
|
| |
|
|
| Эльфийка | Дата: Пятница, 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
Блокировки: 
| Увы, он не знал кинул статью с вики - теперь знает
|
| |
|
|
| [DUОS] | Дата: Пятница, 23 Сентября 2011, 22:38:45 | Сообщение # 5 |
|
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки: 
| Ага. 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|) которые представляются со знаком арифметики Русские люди пишут "целый со знаком"
|
| |
|
|
| 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 не может
real == float ._.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
|
| |
|
|
| tvain | Дата: Воскресенье, 25 Сентября 2011, 20:08:57 | Сообщение # 16 |
6 уровень
Группа: Проверенные
Сообщений: 188
Награды: 0
Репутация: 44
Блокировки: 
| А что тебе здесь нужно? А? 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 (Эльфийка) Статью спер Ранее в других темах я давал на неё ссылку.
|
| |
|
|
|
|
 |
|
 |
|
|