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

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

 
Iron
Листовой
offline
Опыт: 24,427
Активность:
Распространенная ошибка в конструкции If-Then-Else
Не знаю куда это кинуть, так что создам тему. Замечаньице действительно мааааалюсенькое. Но незнание его мне уже достаточно много крови попортило. И вот, буквально пару месяцев назад, я понял почему мои триггеры часто работают не так как рассчитываешь (ранше я бывало перелапачивал весь код, искал проблеммы, но в итоге переделывал все заново). Нет, вы не подумайте, я втриггерах секу. Но просто очень странно, что я не видел ни одного упомянания об этом баге близов.

Собственно по делу. Если вы исспользуете If (multiple conditions), то если then или else у вас пустое, то ОБЯЗАТЕЛЬНО необходимо ставить Do nothing в нем, иначе следующий If будет работать не корректно.

Вот какое короткое замечаньице, но я не разу не слышал упоминаний о нем. Я сам пупею с того, что так долго об этом не знал. А представьте себе новичков, чуствую добрая часть жалоб на неработоспособность триггеров в карте поступает именно из-за незнания данного бага.

Впехните его куды небудь в заметное место.

Iron добавил:
Блин. Я ошибался.
В общем я обнаружил, что вставка Do nothing не дает никакого эффекта.
Вот карта. Если запустить ее в таком виде как она щас, то все пашет нормально, а если выключить up и down триггеры и включить триггеры up bagged и down bagged, то работает не корректно.
Вот карта, скрины ниже в моем посте на этой странице.

Почему это происходит?

Смотри ниже для обьяснения эффекта

Отредактировано NETRAT, 24.11.2006 в 02:06.
Старый 21.11.2006, 18:30
Dark Legioner

offline
Опыт: 817
Активность:
Я конечно не МАСТЕР в триггерах, но о таком уже давно знал. Вот только слово некорректно можно заменить словом непонятно. Например поставил спел, суть в котором была следующая:
-когда кастуется спел то шанс вызвать на цели случайное проклятие (минус броня минус урон и т.д)
Так вот когда я опробую етот спел (естественно в триггере есть строчка if then else) то оказываеся что тип, который должен кастовать random проклетие попросту не вызывается так как нет в строчке условия then do nothing (то есть если там тыры пыры )) нихрена не делать).
Старый 21.11.2006, 18:48
Iron
Листовой
offline
Опыт: 24,427
Активность:
Dark Legioner, да я просто не предпологал что этого близзы не учли.
Старый 21.11.2006, 19:52
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Iron как раз они это учли: Добавили действие "Do nothing". Просто они не могли даже подумать о том что необязательно там вообще что-то писать если ничего делать ненадо(в смысле после "else"). Буржуи - что с них взять. =)))
Старый 21.11.2006, 21:07
Zeratul
Cat Casino
offline
Опыт: 3,638
Активность:
Iron, спс, теперь моя карта работает!
Старый 21.11.2006, 22:18
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
А я видел на некоторых картах вставляли "Do nothing". Думал, нафиг? Я не стал вставлять, код лишним текстом нагружать! А оказывается, вот зачем!...
Старый 21.11.2006, 22:23
NECros88

offline
Опыт: 16,351
Активность:
Я лично всегда ставил! Просто для завершённости, а про баг не знал))
Старый 21.11.2006, 22:34
Dead Jay
Братег Дракончег
offline
Опыт: 8,425
Активность:
Iron я так и думал! Я всегда ставлю Do nothing...Как чуял
Старый 22.11.2006, 12:11
J
expert
offline
Опыт: 48,447
Активность:
Я вроде никогда не замечал... т.к. если else пустое то я его не пишу:)
А если не ставить никаких действий, как будет некоректно работать следующий if ??
Старый 22.11.2006, 14:56
NECros88

offline
Опыт: 16,351
Активность:
Да, небудет работать.
Старый 22.11.2006, 16:06
Iron
Листовой
offline
Опыт: 24,427
Активность:
Jon, вот тут полная чепуха. Иногда в некоторых триггерах следующий if возвращает, например, вместо true - false. Иногда следующий иф ваще игнорируется и действуют ВСЕ действия, что в then, что в else. А иногда ничего не пашет. Причемэто случается не рандомно, а если в триггере проявился 1-й случай, то всегда будет 1-й, если 2-й, то 2-й.
Старый 22.11.2006, 23:44
DioD

offline
Опыт: 45,134
Активность:
хочешь сказать
if true then
elseif false then
else
endif
убъёт процесс?
так знай что это бред.
Старый 23.11.2006, 13:11
adic3x

offline
Опыт: 108,439
Активность:
Хоть они и Близзы, но Ду Нотинг Видно не зря сделали... Спасибо Iron'у, просветил что к чему)))
Старый 23.11.2006, 14:33
Iron
Листовой
offline
Опыт: 24,427
Активность:
DioD, хошь я специально для тебя сделаю карту с данным багом? Просто поставь
Set "i" = random number "1" to "2"
If (multiple conditions)
- - Conditions: i == 1
- - Then: (Любые действия 1)
- - Else: (пустое)
If (multiple conditions)
- - Conditions: i == 2
- - Then: (Любые действия 2)
- - Else: (пустое)

И наслаждайся тем, что срабатывает только 1-й иф (т.е. если выпадет i = 2 , то (действия 2) не произойдут.

Так что нуна Do nothing в Else запихать.
Старый 23.11.2006, 16:41
J
expert
offline
Опыт: 48,447
Активность:
Iron стоит признатся что у тя туповатый WE:) так как у мя все работает, и даже летает...

Jon добавил:
вот.. посмотри мою карту... я ее делал очень давно.. потому не говори что выглядит будто ее делал нуб... http://xgm.guru/maps.php?id=719 , там куча ифоф, и с пустым "иначе", о все работает гладко...

Отредактировано Jon, 24.11.2006 в 04:35.
Старый 23.11.2006, 17:08
Iron
Листовой
offline
Опыт: 24,427
Активность:
Jon, ну я же не говорю что это тотальный баг. Возможно с булеанами все нормально пашет. У тебя там тока булеаны.

Проверь как я сказал и увидишь, что будет лагать (и то не всегда).

В общем когда сталкнешься с такой проблемой, еще спасибо мне скажешь.
Ща покажу пример карты где данный баг будет.

Iron добавил:
Блин. Я ошибался. Но и ты ошибался тоже.
В общем я обнаружил, что вставка Do nothing не дает никакого эффекта.
Вот карта. Если запустить ее в таком виде как она щас, то все пашет нормально, а если выключить up и down триггеры и включить триггеры up bagged и down bagged, то работает не корректно.
Приложил 2-а скрина с обычным и bagged Up триггером. Посмотрите сами. Разницы в действиях не должно быть никакой, а лагает.
DEAD URL DEAD URL

Iron добавил:
А почему это происходит?
Прикрепленные файлы
Тип файла: w3x ManyFloors(bagged).w3x (21.1 Кбайт, 63 просмотров )
Старый 23.11.2006, 20:03
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Баг действительно есть.
Похоже, что надо связывать условия.
Старый 23.11.2006, 20:19
Iron
Листовой
offline
Опыт: 24,427
Активность:
ArchWorm12612, зачем констатировать и так явный факт? Ты бы лучше обьяснил почему есть этот баг.
Старый 23.11.2006, 20:20
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Iron, йа думаю!
o_o
_________
В общем так, уважаемый Утюг. В JASS'e написанное тоже самое работает без проблем. Например
Код:
local integer I = 1
    if I==1 then
       call DisplayTimedTextToPlayer(Player(0),0,0,10,"Работает!")
    else
       call DoNothing()
    endif
    if I!=2 then
       call DisplayTimedTextToPlayer(Player(0),0,0,10,"Работает!!")
    else
       call DoNothing()
    endif

выводит строчку исправно два раза.
Отсюда вывод, что скорее всего, виноваты паровозные триговые функции-условия. Но это неточно я пока не закончил тестинг.

Отредактировано ArchWorm12612, 23.11.2006 в 20:53.
Старый 23.11.2006, 20:25
Iron
Листовой
offline
Опыт: 24,427
Активность:
Червяк, ненадо мне доказывать что все нормально, и что это просто руки у меня кривые. Я же тебе показал карту где этот баг есть, и ты его сам видел. Ты мне обьясни почему там такой баг и получишь конфетку.
Старый 23.11.2006, 20:55

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

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

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

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



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