Что нового

Выход из CASE

mashino

Новичок
Сообщения
21
Репутация
0
Добрый день.
Интересует возможность экстренного выхода из CASE по типу break в языках C/C++ ....
Пример(вообще программа большая, это так, схематично набросал):
Код:
Global $STATEMENT='FIRST'
Global $CounterExit=0
Global $y


While $CounterExit<3
ConsoleWrite("CounterExit="&$CounterExit&@LF)
SELECT
	Case $STATEMENT='FIRST'
		ConsoleWrite("STATEMENT="&$STATEMENT&@LF)
		For $x = 1 To 10
			ConsoleWrite("Цикл1 x="&$x&" "&$STATEMENT&@LF)
			For $y = 1 To 10
				if _CheckOut()=1 then 
					ConsoleWrite("y>5   x="&$x&@LF)
					$STATEMENT='MUSIC'
					ConsoleWrite("Меняю STATEMENT="&$STATEMENT&@LF)
					ExitLoop 3; вот тут к примеру нужно выйти из CASE 1 на уровень SELECT. В итоге выходит за While $CounterExit<3
				EndIf
				ConsoleWrite("Цикл2 y="&$y&@LF)
			Next
		Next
                ;некий код, который НЕ должен выполняться при определенном условии
                ;
                ;код
                ;код
                ;код
                ;код

	Case $STATEMENT='MUSIC'
		ConsoleWrite("STATEMENT="&$STATEMENT&@LF)
		ConsoleWrite("MUSIC+MUSIC"&@LF)



	Case $STATEMENT='DANCE'
		ConsoleWrite("STATEMENT="&$STATEMENT&@LF)




EndSelect
$CounterExit+=1
Wend

ConsoleWrite("===========EXIT===============")


Func _CheckOut()
	if $y>5 then
		ConsoleWrite("Func _CheckOut"&@LF)
		Beep(1000,1000)


		return 1
	EndIf
EndFunc


Ставим ExitLoop 1 - выход из вложенного цикла, ExitLoop 2 - выход из обоих циклов For, ExitLoop 3 - выход из цикла While. Как прервать выполнение CASE ?

ps искал по форуму, ответа не нашел.
есть ContinueCase - но это только продолжит работу скрипта на следующий CASE, мне же нужно, чтоб проверилось условие, выполняться должны только нужные CASE
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Можно деревце Select...EndSelect поместить в еденичный цикл Do...Until так что бы выйти из цикла также закрыв конструкцию Select
Код:
Global $STATEMENT='FIRST'
Global $CounterExit=0
Global $y
Global $exitDo=0

While $CounterExit<3
ConsoleWrite("CounterExit="&$CounterExit&@LF)
Do
SELECT
    Case $STATEMENT='FIRST'
        ConsoleWrite("STATEMENT="&$STATEMENT&@LF)
        For $x = 1 To 10
            ConsoleWrite("Цикл1 x="&$x&" "&$STATEMENT&@LF)
            For $y = 1 To 10
                if _CheckOut()=1 then
                    ConsoleWrite("y>5   x="&$x&@LF)
                    $STATEMENT='MUSIC'
                    ConsoleWrite("Меняю STATEMENT="&$STATEMENT&@LF)
                    ExitLoop 3
                EndIf
                ConsoleWrite("Цикл2 y="&$y&@LF)
            Next
        Next
                ;некий код, который НЕ должен выполняться при определенном условии
                ;
                ;код
                ;код
                ;код
                ;код

    Case $STATEMENT='MUSIC'
        ConsoleWrite("STATEMENT="&$STATEMENT&@LF)
        ConsoleWrite("MUSIC+MUSIC"&@LF)



    Case $STATEMENT='DANCE'
        ConsoleWrite("STATEMENT="&$STATEMENT&@LF)




EndSelect
$exitDo=1;Выходим из цикла
Until $exitDo=1;Выход
$exitDo=0;установка снова для повторного used
$CounterExit+=1
Wend

ConsoleWrite("===========EXIT===============")


Func _CheckOut()
    if $y>5 then
        ConsoleWrite("Func _CheckOut"&@LF)
        Beep(1000,1000)


        return 1
    EndIf
EndFunc

Попробуйте(не протестировал сам)
 
Автор
M

mashino

Новичок
Сообщения
21
Репутация
0
Так работает. Пока не пробовал на основной программе, в тестовой работает как надо. Ставлю тему в РЕШЕНО. Спасибо MnM, натолкнул на решение
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
mashino [?]
Интересует возможность экстренного выхода из CASE по типу break в языках C/C++ ....
В AutoIt3 не требуется типа break , он и так это делает без твоего согласия. Выпрыгиваешь только из цикла, а из Select он и так выпрыгивает после выполнения хотя бы одного Case.
 
Автор
M

mashino

Новичок
Сообщения
21
Репутация
0
В AutoIt3 не требуется типа break , он и так это делает без твоего согласия. Выпрыгиваешь только из цикла, а из Select он и так выпрыгивает после выполнения хотя бы одного Case.
конечно, теперь не требуется. Я ж добавил второй цикл. А до этого никак было не выйти. Ведь я писал, что при определенных условиях некий код НЕ должен выполняться в CASE после проверки этого самого некоего условия.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mashino [?]
НЕ должен выполняться в CASE после проверки этого самого некоего условия
Ну, так и НЕ пишите туда никакого кода, а оставьте пустым. Только зачем нужно такое условие? :-\
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Garrett сказал(а):
Ну, так и НЕ пишите туда никакого кода, а оставьте пустым. Только зачем нужно такое условие? :-\
Дак суть тут вполне ясна же. По крайней мере в сфере ботоводства частенько бывает такое что нужно выполнить какое-то условие и начинается его выполнение, но вдруг резко нужно выскочить из этого условия и выполнить другое.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
mashino [?]
при определенных условиях некий код НЕ должен выполняться в CASE после проверки этого самого некоего условия

Код:
$iFlag = 1
For $i = 1 To 10
	For $j = 1 To 10
		If "условие" Then
			$iFlag = 0
			ExitLoop 2
		EndIf
	Next
Next
If $iFlag Then
	...
EndIf
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
mashino [?]
конечно, теперь не требуется.
Не теперь, а вообще не требуется. А если делать по примеру MnM, то непонятно зачем усложнять
Код:
$exitDo=1;Выходим из цикла
Until $exitDo=1;Выход

проще сделать одношаговый цикл, смотри последний пример здесь

Вашу логику я понял, требуется выход из Select не окончив выполнение блока Case, тогда да, требуется одношаговый цикл. Просто в Си выполняются все Case соответствующие условию и там для каждого нужен break вот это и сбило с понимания того что требуется.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
А если в первом примере вместо ExitLoop 3 использовать ContinueLoop 3 ?
 
Автор
M

mashino

Новичок
Сообщения
21
Репутация
0
частенько бывает такое что нужно выполнить какое-то условие и начинается его выполнение, но вдруг резко нужно выскочить из этого условия и выполнить другое.
именно.
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
Вы можете правильно сформулировать вопрос. Есть просто логическая конструкция для выхода (в чистом виде её предложил asdf8), а на счёт резкости, оно всё получается резко, процессор то миллионы операций в секунду выполняет. Ключевое слово "вдруг" не является критерием.
 
Автор
M

mashino

Новичок
Сообщения
21
Репутация
0
AZJIO
1) вопрос решен
2) миллионы операций в секунду - это да, но когда дело доходит до систем реального времени, и начинается действие в программе, которое займет по времени 20-40 секунд или более - а надо срочно выйти из этого CASE - то нужно именно то что я искал.
3) то что предложил asdf8 не совсем то. В CASE идут операции/действия, которые нужно выполнять при определенных условиях. Если условия поменялись, то и нужно срочно выйти из CASE, а не писать потом везде IF.
4) задачу я сформулировал четко в первом посте - необходим выход из CASE, для примера программы привел некую конструкцию, в которой показал работу ExitLoop. Сама программа имеет несколько вложенных циклов и CASE.

Всем добра
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
mashino [?]
Если условия поменялись, то и нужно срочно выйти из CASE, а не писать потом везде IF.
ну так
Код:
If
и пишут, чтобы проверить условие. на каждом цикле вначале проверять условие. если циклы вложенные, то и там проверять.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
AZJIO вы мои мысли читаете, я сначала хотел написать ответ Belfigor, но потом подумал и не стал ;D
Я подумал, если человек который программирует и пишет:
Belfigor [?]
значить уже скоро роботы поработят своих создателей, потому как "вдруг" это уже интеллектом попахивает ;D
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
OffTopic:
Garret сказал(а):
значить уже скоро роботы поработят своих создателей
Это не так уж и плохо, для создателей это будет уроком. И к тому же если машины научатся царствовать над миром скорее всего они его не так загадят в отличии от людей=).
 
Верх