Переменные JASS.
Подстатья
20 156
23
При изменении размера будет утечка четырёх байт на каждое значение отличное от null
Т.е. локальные массивы типа Handle лучше задавать начиная с последнего индекса?
local rect array r
set r[3]=Rect(0,0,1,1)
set r[2]=Rect(0,0,1,1)
set r[1]=Rect(0,0,1,1)
set r[0]=Rect(0,0,1,1)

Для выделения памяти массивам типа handle достаточно присвоить значению с последним индексом значение null? Или нужно присвоить существующий объект?
local rect array r
set r[500]=null
23
Unryze, Хорошо, спасибо. Не придется циклы писать )
Ок)
20
EugeAl, да, set someInts[1000] = 5000 первая установка значения так же инициализирует индексы от 0 до X Как я и указал индексы от 0 до 1023 (ибо размер 1024) будут заполнены нулями, а индекс 1000 примет значение 5000.
Уйму статей потому я и опровергал в Jass Mythbusters, и потому был дан резкий ответ, чтобы последующие мифы не рождались.
23
Unryze, set someInts[1000] = 5000 первая установка значения так же инициализирует индексы от 0 до X
Это действие инициал все предыдущие ячейки тоже?
a2 (индекс) меньше числа (размера) - то вернуть это число по индексу a2.
a2 (индекс) больше или равен числу (размеру) - то вернуть 0.
Спасибо!
"проверено" - не проверив / не зная внутренности движка - и есть "дезинформация"
тогда можно 95% статей по варкрафту с ХГМ удалять, ведь практически никто из авторов не имеет доступа к движку и тем более исходному коду, ведь они не из близзард, и значит, у них "дезинформация". Хотя они тоже "проверяли", как и я.
Не желаю более возвращаться к этой теме.
20
globals
	integer array someInts // массив пустой, get любого индекса вернёт 0, по указанным выше причинам.
endglobals

function TestArrayStuff takes nothing returns nothing
	set someInts[1000] = 5000 // первая установка значения так же инициализирует индексы от 0 до X по мере возрастания 1/2/4/8/16/32/64 то есть после 64 индекса расти будет по 64. И того выделиться размер в 1024, то бишь от 0 до 1023.
endfunction
Поясняю, в Jass нельзя именно инициализировать массив, ибо он растёт автоматически, у него нет требования указания строго размера как допустим в AS:
array<unit> U_SelectionSelArr( 12 );
Ты путаешь вещи, и писать "проверено" - не проверив / не зная внутренности движка - и есть "дезинформация", ибо ответ твой был в корне неверный.
Ну и закончим опять же этим кодом:
//----- (6F459730) --------------------------------------------------------
int __thiscall JassVM::GetArrayValueById(uint32_t *this, unsigned int a2)
{
  int result; // eax

  if ( a2 < this[2] )
    result = *(uint32_t *)(this[3] + 4 * a2);
  else
    result = 0;
  return result;
}
Даже без знания ЯП у тебя лишь 2 варианта:
  1. a2 (индекс) меньше числа (размера) - то вернуть это число по индексу a2.
  2. a2 (индекс) больше или равен числу (размеру) - то вернуть 0.
Ну ты и опирался на 2) не понимая почему так.
23
Unryze, я не разбираюсь в с++.
Значит, массивы инициализировать не обязательно, если есть стандартное значение. Спорил я для того, чтобы установить истину ) а то один одно говорит, другой другое, это непорядок, нужно было узнать.
20
EugeAl, ещё раз, посмотри мои скрины глазами, а не пятой точкой. То, что "null" применимо к string - не значит, что это СТОИТ использовать, джассу то пофиг, ибо строки по сути в переменной хранят индекс на текст, а не сам текст. Потому 0 = null = "", но когда это дело нужно транслировать допустим в AS, то начинаются отстрелы задниц, когда строки сравнивают с null, что недопустим в AS.
Повторяю на более простом языке, когда у тебя массив только объявлен, то размер равен нулю, так как индекс 0 >= размеру, то возвращается всегда 0, не потому что в нём есть значение, а потому что 0 - это стандартное значение. На кой болт ты споришь - непонятно.
И повторюсь в третий раз, ВЫВОД 0 НЕ ОЗНАЧАЕТ ЧТО У НАС БЫЛА ИНЦИАЛИЗАЦИЯ, то, что игра не отстреливает - как раз причина проверки индекса против размера.
Надеюсь столько повторений хватит.
Типы данных JASS.
Подстатья
6 156
18
Эх упущен опыт варкрафтеров по хранению нескольких малых чисел внутри большого числа

Тут кстати можно добавить функцию как выводить числа с плавающей точкой больше сколько-то знаков чем выводит стандартная функция вывода, помнится PT153 скидывал
Циклы в JASS.
Подстатья
3 117
18
Сам пользуюсь аналогом for
for i in range(0, 10):
	# code
set i = 0
loop
exitwhen i >= 10
    // code
set i = i + 1
endloop
Условия в JASS.
Подстатья
7 120
18
Разгадка сего действия проста - если первым аргументом функции AND был передан false то игра перестаёт считать выражение и экстренно возвращает false
Тут хорошо бы уточнить подразумевается false как значение выражения или false как переменная "false", и если первое то получается все выражения с and надо оборачивать в скобки