XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
NCrashed

offline
Опыт: 13,553
Активность:
Упрямая функция
С этой функцией у мня случился трабл. При первом вызове она возвращает значение нормально, но второй, третий и т.д вызовы (при абсолютно таких же условиях) она возвращает юнита неправильно (т.е должна была возвратить юнита в if'е, а возвращает последний return). Может проблема не в ней?
Код:
function GetUnitStart  takes unit u returns unit
local integer i = 0
local integer i2 = get_object_iparam(null,"PomPC")
local rect r
 loop
  set r = get_object_rectparam(null, "PomP" + I2S(i))
  if RectContainsUnit( r , u) then
   set u = null
   return get_object_uparam(r , "C" ) 
  endif 
 exitwhen i == i2
  set i = i + 1
 endloop
set i = 0
set u = null
set r = null
return gg_unit_ncp2_0003
endfunction
Старый 14.06.2008, 16:56
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Попробуй так:
Код:
function GetUnitStart takes unit u returns unit
    local integer i = 0
    local integer i2 = get_object_iparam(null,"PomPC")
    local rect r1 = null
    local rect r2 = null
    loop
        set r1 = get_object_rectparam(null, "PomP" + I2S(i))
        if RectContainsCoords(r1, GetUnitX(u), GetUnitY(u)) then
            call BJDebugMsg("GetUnitStart: unit u is in rect r1")
            set r2 = r1
        endif 
        exitwhen i >= i2
        set i = i + 1
    endloop
    set r1 = null
    if r2 != null then
        call BJDebugMsg("GetUnitStart: returning value from r2")
        return get_object_uparam(r2, "C")
    endif
    return gg_unit_ncp2_0003
endfunction

Если не будет работать, то проследи за сообщениями, выдаваемыми на экране, проконтролируй запись в кеш в данные поля (мб где-то обнуляется значение, но это маловероятно).

Вообще по отладке кода в варе рекомендую прочитать статью "Ищем баги сами"
Старый 14.06.2008, 17:31
NCrashed

offline
Опыт: 13,553
Активность:
Проблема была не в функции. Дальше по триггеру, после использования этой функции, я делал оптимизацию: удалял ненужные триггеры, стирал из кеша записи, относящиеся к этим триггам. Как только я отправил в коменты функции "call flush_object(tr)"(tr не относится к триггу с функцией), баг исчез. Интересно: как очистка куска кеша влияет на целый кеш? Причем, данные, нужные функции записаны на объект "null", а после очистки от записей для объекта tr, тоже обнуляются.
Старый 14.06.2008, 18:31
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Ну, имхо, это может быть только от некорректной последовательности при очистке, то есть:
Код:
// ...
    call DestroyTrigger(tr)
    set tr = null
    call flush_object(tr)

Переменную следует обнулять после всех манипуляций с ней:
Код:
// ...
    call DestroyTrigger(tr)
    call flush_object(tr)
    set tr = null
Старый 14.06.2008, 19:02
NCrashed

offline
Опыт: 13,553
Активность:
Вот тогда проблемный кусок кода. Вроде некорректной последовательности нету. А если и была, то я бы ее сразу увидел.

Код:
set tr = get_object_trparam(u, "reactiontr")
    call set_object_bparam(tr, "flushed", true)
    call DisableTrigger(tr)
    call TriggerClearActions(tr)
    call PolledWait(1)
    call flush_object(tr)
    call DestroyTrigger(tr)
Старый 14.06.2008, 19:25
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:12.