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

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

Ответ
 
Kenshi

offline
Опыт: 1,101
Активность:
Выход из триггера
Нужна нейтив функция для выхода из работы триггера во время его выполнения, то есть например внутри триггера стоит условие, если оно верно или ложно, то триггер прекращает этот поток, но в дальнейшем работает.
Старый 05.11.2008, 16:04
Лось

offline
Опыт: 7,223
Активность:
Оператор возврата из ф-ии return.
Старый 05.11.2008, 16:08
Kenshi

offline
Опыт: 1,101
Активность:
А что за функция?
Старый 05.11.2008, 16:23
agentex

offline
Опыт: 34,834
Активность:
это не функция просто
Код:
return

пишешь где надо выйти
и наверно
Цитата:
дальнейшем сработает*
имелось ввиду
Старый 05.11.2008, 16:27
Kenshi

offline
Опыт: 1,101
Активность:
она выходит также из if then endif, так что ее нельзя применить в моем случае
Старый 05.11.2008, 16:34
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Kenshi
Ну дак ты в этом if'е и напиши все необходимые условия выхода из него.
Старый 05.11.2008, 16:47
Kenshi

offline
Опыт: 1,101
Активность:
Если я внутри Ифа напишу return то он выйдет не из процедуры а из этого ифа, а мне надо из процедуры
Старый 05.11.2008, 21:32
ScorpioT1000
Работаем
offline
Опыт: отключен
он выйдет из функции. Причем return надо если она ничо не возвращает, иначе return <тип> =)
//в последнем не уверен

ScorpioT1000 добавил:
пример
Код:
function lol takes integer a returns boolean
    if a == 1 then
        set a = 2
    else
        return false //все, кончилась!
    endif

    //lol lol lol
    return true //а тут если удачно
endfunction

Отредактировано ScorpioT1000, 05.11.2008 в 22:09.
Старый 05.11.2008, 21:39
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
return в качестве выхода из цикла в JASS не используется. он всегда является точкой выхода из текущей функции (даже если она ничего не возвращает, что и есть процедура ^^)
Старый 05.11.2008, 22:02
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Kenshi
Ну я же сказал уже. Ты вбивай нужное условие (из-за которого должен прекратиться цикл) в exitwhen.
Пример:
Код:
// пусть изначально такой цикл:
loop
  exitwhen i==10
  call DoSomething1()
  if SomeVar==0 then
    return
  endif
  call DoSomething2()
  set i=i+1
endloop

// допустим тебе нужно выйти из цкла (но не из функции)
// если SomeVar будет равно нулю, то делай так:

loop
  exitwhen (i==10) or (SomeVar==0)
  call DoSomething1()
  call DoSomething2()
  set i=i+1
endloop

Отредактировано ShadoW DaemoN, 17.11.2008 в 10:47.
Старый 05.11.2008, 22:06
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
А другого способа (наподобии ретерна) для выхода из циклов нет? А то не всегда ведь удобно дополнительное условие забивать.. А ретерн не всегда уместен..
Старый 17.11.2008, 10:07
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Ну можно ещё принудительно сделать какое-то условия выхода. Например если цикл со счетчиком до 10-ти, то по необходимости сразу установить 10 и цикл завершиться. Только не знаю, зачем все эти извращения, проще сразу все условия выхода написать.
Старый 17.11.2008, 10:38
I.Todd

offline
Опыт: 12,046
Активность:
Elemental, ты break имеешь ввиду, ты считаешь он уместнее чем return?
Учись не пользоваться Breakом... ничем хорошим это не закончится. У нас в Универе, при использовании Break задачу не засчитывали, не смотря на то, что она выполняла все необходимые действия. И это было 10 лет назад... а Сейчас вообще НУЖНО забыть о преждевременных выходов из условий и циклов.
Старый 17.11.2008, 10:39
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Это делается примерно так:
Код:
local integer i = 0
local integer eax
loop
  // . . .
  // условие выхода
  if eax>0 and eax<10 and eax != 3 and eax != 7 then
    // чтобы выйти из цикла, нужно удовлетворить условие в exitwhen
    set i = 10
  endif
  exitwhen i == 10
  // . . .
  set i = i + 1
endloop

Однако в данном случае разумнее будет написать все в exitwhen.

I.Todd, все бы хорошо, только вот нету в джассе операции break как таковой. =)
Старый 17.11.2008, 10:46
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
Elemental, ты break имеешь ввиду, ты считаешь он уместнее чем return?
Учись не пользоваться Breakом... ничем хорошим это не закончится. У нас в Универе, при использовании Break задачу не засчитывали, не смотря на то, что она выполняла все необходимые действия. И это было 10 лет назад... а Сейчас вообще НУЖНО забыть о преждевременных выходов из условий и циклов.

факты есть? нет. я не вижу пока отличия между лишней проверкой на bool в цикле и брейком
Старый 17.11.2008, 23:08
dk

offline
Опыт: 60,293
Активность:
Если юзать break как некий аналог goto, только для цикла, то это не гуд... Как известно goto - говнокоддинг. Пример:
Код:
while (TRUE)         
{
   ...
   // Много кода
   ...
   // Много кода
   ...
   if ( $i++ > STOP_VALUE) break;
}

Вот подобное его "использование" явно не гуд...

dk добавил:
Пример конечно жосткий, но всеж...
Старый 18.11.2008, 13:38
adic3x

offline
Опыт: 108,439
Активность:
пример действителдьно жоский)

многое делается ифом

Код:
func
 if b then
  return
 endif
 // code
endfunc

// --->

func
 if not b then
  // code
 endif
endfunc


ADOLF добавил:
в циклах, в которых предусмотрена специальная инчструкция выхода из него (тот же while) надо использовать именно ее

а вообще лично я понял настоящую сущность циклов только когда осилил асм)
Старый 18.11.2008, 14:56
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
И.Тодд, ты категорически не прав заявляя, что нужно забыть о преждевременном выходе из цикла-на форуме масса информации о том, как оптимизировать код, устранять утечки-нафиг надо засорять память циклом, который будет срабатывать еще раз сто,вместо того чтобы уже например на 5 шаге выйти из него, тем самым разгружая проц компа?
В Си++ есть оператор перебора (так вроде, если не ошибаюсь) - switch - на jass есть что то подобное?
Старый 19.11.2008, 11:45
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
В Си++ есть оператор перебора (так вроде, если не ошибаюсь) - switch - на jass есть что то подобное?
нет
Старый 19.11.2008, 12:01
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
И.Тодд, ты категорически не прав заявляя, что нужно забыть о преждевременном выходе из цикла-на форуме масса информации о том, как оптимизировать код, устранять утечки-нафиг надо засорять память циклом, который будет срабатывать еще раз сто,вместо того чтобы уже например на 5 шаге выйти из него, тем самым разгружая проц компа?

перечитал пост пару раз. вроде написанно умными словами, но... хотя тодд тоже сказал непонячтно что)

я напомню, что exitwhen может стоять в цикле в нескольких местах, и что также в него может быть помещенно более сложное условие, к примеру не только равенство переменной опред. числу, но и еще что угодно

Цитата:
У нас в Универе, при использовании Break задачу не засчитывали

как ни прискорбно, но всех кого я знал рассказывали, что у них в универе преподы по проганью редкие идиоты...

ADOLF добавил:
Цитата:
хотя тодд тоже сказал непонячтно что)

хотя брек - это безусловный переход, jmp *label* по нашему) конечно если есть еще какой либо условие (if к примеру) то мы уже получаем два прыжка, это явно нетру

ADOLF добавил:
Цитата:
В Си++ есть оператор перебора (так вроде, если не ошибаюсь) - switch - на jass есть что то подобное?

Код:
c++           ||    jass
              ||
switch (x)    ||
{             ||
case a:       ||    if x==athen
// 00         ||    // 00
break;        ||
case b:       ||    elseif x==b then
// 01         ||    // 01
break;        ||
case c:       ||    elseif x==c then
// 02         ||    // 02
break;        ||
default:      ||    else
// 03         ||    // 03
}             ||    endif
Старый 19.11.2008, 13:46
Ответ

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

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

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

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



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