AdicHelper?

Здравствуйте, в пустой карте есть код:
function present takes integer i returns integer
  return i
endfunction

function temp takes nothing returns nothing
  integer dot = 1
  dot = present(dot)
endfunction
Который останавливает компиляцию AdicHelper.
Если изменить temp на :
function temp takes nothing returns nothing
  integer dot = 1
  set dot = present(dot)
endfunction
То компилируется без проблем. В чем же подвох?

Ответ

Vlod, cJass немного багнут, по всей видимости, воспринимает dot как do.


Views: 1 570

Vlod #4 - 2 years ago 0
Голосов: +0 / -0
PT153, поправил поправленное описание
PT153 #5 - 2 years ago (изм. ) 0
Голосов: +0 / -0
А в чём проблема переменной без значения?
При обращении к переменной без значения поток обрывается. Вот у массивов все ячейки имеют дефолтное значение, обычнве переменные нет.
Vlod, а какая ошибка?
NazarPunk #6 - 2 years ago (изм. ) 0
Голосов: +0 / -0
При обращении к переменной без значения поток обрывается.
Правда? А посему декларация переменных поток не сбрасывается?
Вот у массивов все ячейки имеют дефолтное значение
А не обращение к несуществующему элементу массива возвращало null?
PT153 #7 - 2 years ago 0
Голосов: +0 / -0
Правда?
В JASS так, даже последний pjass.exe это определяет.
А посему декларация переменных поток не сбрасывается?
Не понял.
А не обращение к несуществующему элементу массива возвращало null?
Все элементы массива по умолчанию заполнены нулями.
NazarPunk #8 - 2 years ago 0
Голосов: +0 / -0
Все элементы массива по умолчанию заполнены нулями.
Если б это было так, то простое объявление массива сжирало всю доступную память.
Vlod #9 - 2 years ago 0
Голосов: +0 / -0
PT153:
Vlod, ты всегда пытаешься использовать переменную без значения.
Теперь переменная имеет начальное значение. Хочу отметить, что компиляция кода:
function temp takes nothing returns nothing
  integer i
  i = present(i)
endfunction
И так не вызывает ошибок. Хотя поток и оборвется при исполнении.
Обратите внимание на название переменной в вопросе
PT153 #10 - 2 years ago (изм. ) 0
Голосов: +0 / -0
Если б это было так, то простое объявление массива сжирало всю доступную память.
Что за чушь? Объявление массива аллоцирует под него место и заполняет нулями (как calloc в C). Потому начальные значения у массива есть false, 0, 0. и null. Для обычной переменной заполнения нулями не происходит, потому там может быть что угодно. Использование переменной без установленного значения (которое может быть присвоено во время определения переменной или после) обрывает поток.

И так не вызывает ошибок.
Потому что используете старый pjass.exe, используйте новый.
То компилируется без проблем. В чем же подвох?
Если писать на cJass, то надо писать на cJass. Верно будет так.

cJass

void temp() {
  integer dot = 1
  dot = present(dot)
{

JASS\vJass

function temp takes nothing returns nothing
  local integer dot = 1
  set dot = present(dot)
endfunction
NazarPunk #11 - 2 years ago 0
Голосов: +0 / -0
Объявление массива аллоцирует под него место и заполняет нулями (как calloc в C).
А почему нолями, а не null?
PT153 #12 - 2 years ago (изм. ) 0
Голосов: +0 / -0
А почему нолями, а не null?
Выше пояснил. 0 = false = null, в том же vJass в структурах (что являются integer) идёт сравнение с null. JASS не ругается.
NazarPunk #13 - 2 years ago 0
Голосов: +0 / -0
Выше пояснил. 0 = false = null, в том же vJass в структурах (что являются integer) идёт сравнение с null.
А почему он тогда ругается на false > null?
PT153 #14 - 2 years ago (изм. ) 0
Голосов: +0 / -0
А почему он тогда ругается на false > null?
Ну этого сказать не могу, но инты с null JASS норм сравнивает.
Это ещё зависит от версии pjass.exe, последний может быть на это не реагирует.