Что нового

Ошибка ContinueCase в версии 3.3.8.0

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
По своему опыту могу сказать, что ContinueCase в том виде, как оно работает сейчас, довольно часто приходилось применять, а вот в дополнительном сравнении не было необходимости. В любом случае можно написать так:

Код:
$Var = 4

Select
	Case $Var > 10
		ConsoleWrite($Var & ' > 10' & @CR)
		ContinueCase
	Case $Var > 5
		ConsoleWrite($Var & ' > 5' & @CR)
		ContinueCase
	Case $Var > 2
		ConsoleWrite($Var & ' > 2' & @CR)
	Case Else
		ConsoleWrite($Var & ' <= 2' & @CR)
EndSelect


Или так:

Код:
Do
	If $Var > 2 Then
		ConsoleWrite($Var & ' > 2' & @CR)
	Else
		ExitLoop
	EndIf
	If $Var > 5 Then
		ConsoleWrite($Var & ' > 5' & @CR)
	Else
		ExitLoop
	EndIf
	If $Var > 10 Then
		ConsoleWrite($Var & ' > 10' & @CR)
	Else
		ExitLoop
	EndIf
	ConsoleWrite($Var & ' <= 2' & @CR)
Until 1



Добавлено:
Сообщение автоматически объединено:

И не забывайте, что после "Case" может стоять и функция, не обязательно переменная.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
asdf8
Объясни чем это не подходит. Два раза не проверяется, если один Case сработал то второй проверяется один раз. И Else по сути проверка не нужна "если хоть один Case сработал, то Else не сработает". Флаг там не нужен.

Код:
$var = 4

Select
	Case $var > 2
		ConsoleWrite('-> Case :' & $var & ' > 2' & @CRLF)
		If $var > 5 Then ContinueCase
	Case $var > 5
		ConsoleWrite('-> Case :' & $var & ' > 5' & @CRLF)
		If $var > 10 Then ContinueCase
	Case $var > 10
		ConsoleWrite('-> Case :' & $var & ' > 10' & @CRLF)
	Case Else
		ConsoleWrite('-> Case Else' & @CRLF)
EndSelect
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
Yashied [?]
По своему опыту могу сказать, что ContinueCase в том виде, как оно работает сейчас, довольно часто приходилось применять, а вот в дополнительном сравнении не было необходимости.

Похоже я ContinueCase использовал в AutoIt первый раз :smile:
Просто привык к несколько другому поведению оператора продолжения обработки Case.

AZJIO [?]
Объясни чем это не подходит.

Подходит. Я не заметил, что перед Case Else нет ContinueCase :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ContinueCase мог бы себя вести как ContinueLoop, т.е переводить выполнение кода в начало Case (т.е к Select/Switch), а для перевода к следующему условию, добавить новое ключевое слово - NextCase, и причём добавить в него параметр как у ContinueLoop, типа -1 это проверка на условность, 1 это следующий Case, 2 на один ниже, и т.д.

Но ошибки как таковой нет, это намеренное поведение.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
ContinueCase мог бы себя вести как ContinueLoop

я обеими руками за.

т.е переводить выполнение кода в начало Case (т.е к Select/Switch)

это будет уже ContinueSelect и ContinueSwitch, судя по смыслу, ContinueCase должен бы проводить дальнейшую обработку условий Case,
и, если ни одно условие не выполнилось, выполнить Case Else (если он имеется).


а для перевода к следующему условию, добавить новое ключевое слово - NextCase

получается, что, с параметрами отличными от -1, это получится сильно усеченный оператор Goto, а существующий на данный момент оператор ContinueCase является тем же, но еще более усеченным, оператором безусловного перехода, в операторах условного перехода Select и Switch. С точки зрения расширения универсальности использования, лучше сразу просить восстановить оператор Goto, но что-то мне подсказывает, каким будет результат таких просьб.

Но ошибки как таковой нет, это намеренное поведение.

Тогда имеется ошибка в описании функций Select и Switch :

Код:
If the expression is true the following statements up to the next Case or EndSelect statement are executed. If more than one of the Case statements are true, only the first one is executed.

т.е. не указано, что, код, после Case, будет выполнен не только в случае если будет верно условие, указанное в Case, но также если в предыдущем Case будет выполнен оператор ContinueCase.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
не указано, что, код, после Case, будет выполнен не только в случае если будет верно условие, указанное в Case, но также если в предыдущем Case будет выполнен оператор ContinueCase
Это есть в ContinueCase, зачем это в Select/Switch?
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
Это есть в ContinueCase, зачем это в Select/Switch?

Существования описания к ContinueCase, все равно не делает правильным описание к Select и Switch о том, что код выполняется после того Case, в котором выполняется условие.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
asdf8
Вначале новичок пускай разберётся с синтаксисом Select/Switch, и ему долго не понадобится этот ContinueCase, даже когда он будет знать о его существовании. Тем более ссылка ниже есть, под "См. также".

Тут грань между добавлением кучи оговорок и оговорок к оговоркам и локаничностью, простотой.

ContinueCase даже из цикла выходит
Код:
$b=21
Switch $b
    Case 11 To 22
        For $i = 1 To 20
			$b += 1
			ContinueCase
		Next
    Case 1
        $b -= 20
    Case Else
        $b = "иное"
EndSwitch

MsgBox(4096, '', $b)
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
Тут грань между добавлением кучи оговорок и оговорок к оговоркам и локаничностью, простотой.

Т.е. правильность описания в расчет не берется?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
asdf8
Т.е. правильность описания в расчет не берется?
Описание правильно, его можно назвать неполным. Если новичок не знает про ContinueCase, то у него не возникнет вопросов по поводу полноты описания. Когда узнает про ContinueCase, то его описание дополнит знание о том что следующий блок можно выполнить без учёта условия.
 
Верх