#1 25-02-2017 20:55

JetFly
Registered: 24-02-2017
Posts: 9

2 условия в while

Есть код:

while 2@ > 50  2@ < 78
    01F3: car 1@ in_air
end

Не компилируется.Есть вариант с while 2@ > 50 && 2@ < 78,но все равно ничего.Помогите.

Offline

#2 25-02-2017 22:30

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: 2 условия в while

В конструкцию к while можно подставить только одно условие. Но можно сделать так:

while true
     wait 0 // не забываем добавить задержку в цикл с (вероятно) большим кол-вом повторений

    // обновляем 2@
    
    if or
        2@ < 50
        2@ > 78
    then
        break
    end
end

Last edited by DK22Pac (25-02-2017 22:34)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#3 26-02-2017 15:39

JetFly
Registered: 24-02-2017
Posts: 9

Re: 2 условия в while

wow

Offline

#4 26-02-2017 15:41

JetFly
Registered: 24-02-2017
Posts: 9

Re: 2 условия в while

Да блин,пора уже отвечать другим,а то ток спрашиваю)

Offline

#5 26-02-2017 21:51

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: 2 условия в while

В циклах (while, repeat) ещё можно использовать условный gosub.

while gosub @Check
wait 0
//действия
end 

:Check
if and //или if or
//условие 1
//условие 2
then
0485:  return_true
else
059A:  return_false
end
return

У меня работало, это удобно. Можно и внутрь while true вставить условия, как показал DK22Pac.

Last edited by Vital (26-02-2017 21:52)

Offline

#6 27-02-2017 05:20

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: 2 условия в while

Vital wrote:

В циклах (while, repeat) ещё можно использовать условный gosub.
У меня работало, это удобно.

Не скажу, что это удобно. Код должен быть легко читаем и максимально оптимизирован. В этом код DK22Pac смотрится предпочтительней. Но код можно сократить до такого варианта:

while 2@ > 50
wait 0 
    // обновляем 2@
    if 
      78 > 2@
    jf break
end

wink

Last edited by kenking (27-02-2017 05:31)

Offline

#7 27-02-2017 19:54

Seemann
Registered: 07-08-2006
Posts: 2,109

Re: 2 условия в while

Vital wrote:

В циклах (while, repeat) ещё можно использовать условный gosub.

while gosub @Check
wait 0
//действия
end 

:Check
if and //или if or
//условие 1
//условие 2
then
0485:  return_true
else
059A:  return_false
end
return

У меня работало, это удобно. Можно и внутрь while true вставить условия, как показал DK22Pac.

В этом варианте внутри Check не нужны 0485 и 059A, т.к. опкод jump_if_false (который используется в циклах) читает результат последней проверки, который обновляется после применения любого условного опкода.

while gosub @Check
wait 0
//действия
end 

:Check
if and //или if or
//условие 1
//условие 2
return

Но вообще это костыли от ограниченности компилятора(

Offline

#8 27-02-2017 22:24

Vital
From: Москва
Registered: 07-11-2010
Posts: 64
Website

Re: 2 условия в while

Seemann wrote:

В этом варианте внутри Check не нужны 0485 и 059A, т.к. опкод jump_if_false (который используется в циклах) читает результат последней проверки, который обновляется после применения любого условного опкода.

Ого, этого не знал, спасибо! А это не может сработать в условном gosub не в цикле? У меня такая (гуманитарная) логика: если в цикле при условном gosub можно обойтись без return_true/false, то без них можно обойтись везде, так как высокоуровневые конструкции игрой "разбираются" на низкоуровневые конструкции с метками, то есть на "начальном" уровне они ничем не отличаются друг от друга. Если так, то зачем нужны 0485 и 059А?
Но скорее всего, я просто недопонимаю.

Ещё раз благодарю за этот нюанс!

Offline

#9 02-03-2017 19:53

Seemann
Registered: 07-08-2006
Posts: 2,109

Re: 2 условия в while

Vital wrote:
Seemann wrote:

В этом варианте внутри Check не нужны 0485 и 059A, т.к. опкод jump_if_false (который используется в циклах) читает результат последней проверки, который обновляется после применения любого условного опкода.

Ого, этого не знал, спасибо! А это не может сработать в условном gosub не в цикле? У меня такая (гуманитарная) логика: если в цикле при условном gosub можно обойтись без return_true/false, то без них можно обойтись везде, так как высокоуровневые конструкции игрой "разбираются" на низкоуровневые конструкции с метками, то есть на "начальном" уровне они ничем не отличаются друг от друга. Если так, то зачем нужны 0485 и 059А?
Но скорее всего, я просто недопонимаю.

Ещё раз благодарю за этот нюанс!


0485/059A удобно использовать как результат функции. Этот результат в простейшем случае равен результату одной проверки, как в нашем примере с Check. Но если взять более сложные примеры, где внутри функции есть цепочка проверок, то такой трюк уже не прокатит. Например:

:Check
if x > 0
  then
    if y > 0
    then
     return_false
     ret 0
    end
end
return_true
ret 0

Ну и, вообще это "неочевидная возможность", которая во многих случаях вредит читабельности кода и отлавливанию ошибок. Подобные функции становятся очень чувствительными к порядку выполнения команд. Как и в обычном программировании, писать код в таком стиле не рекомендуется.

Offline

Board footer

Powered by FluxBB