Что нового

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

asdf8

Скриптер
Сообщения
564
Репутация
152
Вот пример:

Код:
$var = 4

Select
	Case $var > 2
		ConsoleWrite('-> Case :' & $var & ' > 2' & @CRLF)
		ContinueCase
	Case $var > 5
		ConsoleWrite('-> Case :' & $var & ' > 5' & @CRLF)
	Case Else
		ConsoleWrite('-> Case Else' & @CRLF)
EndSelect
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В чём ошибка?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
asdf8
Код:
ContinueCase

Это по типу принудительного исполнения следующего условия Case следуемого за текущим условием Case. При этом валидность самого условия не имеет значение.
 
Автор
A

asdf8

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

CreatoR [?]

ContinueCase тупо выполняет следущий Case, даже если условие не выполняется.

Garrett [?]
Это по типу принудительного исполнения следующего условия Case следуемого за текущим условием Case. При этом валидность самого условия не имеет значение.

по правде говоря - это ересь какая-то. Не могу припомнить в синтаксисе какого ЯП есть такое поведение Case и его продолжения.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Порой бывает полезно. Это специфичный оператор.
Вот пример из справки
Код:
$msg = ""
$szName = InputBox(Default, "Пожалуйста, введите букву.", "", " M", Default, Default, Default, Default, 10)
Switch @error
Case 2
    $msg = "Время истекло. "
    ContinueCase
Case 1; Если время истекло, то добавится фраза "Скрипт завершает свою работу.", иначе в $msg будет просто "Скрипт завершает свою работу."
    $msg &= "Скрипт завершает свою работу."
Case 0
    Switch $szName
    Case "у", "е", "ы", "а", "о", "э", "я", "и", "ю"
        $msg = "Гласная!"
    Case Else
        $msg = "Не гласная!"
    EndSwitch
Case Else
    $msg = "Другая ошибка вызванная неправильным указанием параметров функции."
EndSwitch
MsgBox(4096, Default, $msg)
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
Ну тогда, в справке к функциям Select и Switch нужно указать, что Case выполняется если условие выполняется или в предыдущем Case имеется ContinueCase.
И вот это будет смешно.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
Очень часто использую такой блок:
Код:
While 1
	Switch GUIGetMsg()
		Case $ok
			; блок проверки по кнопке ОК
			ContinueCase
		Case -3
			GUISetState(@SW_ENABLE, $Gui)
			GUIDelete($Gui1)
			ExitLoop
	EndSwitch
WEnd

Чтобы продолжить закрытие дочернего окна по кнопке ОК или закрытия окна, без дублирования строчек закрытия в блоке Case $ok
И в справке ContinueCase написано верно.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
И в справке ContinueCase написано верно.

Значит неверна справка к Select и Switch.

Я считаю - в таком виде ContinueCase оператор избыточный и легко заменим, и, при этом, отсутствует оператор обработки следующих условий Case.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
Значит неверна справка к Select и Switch.
А где в справке в Select и Switch упоминание ContinueCase?



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

asdf8
в таком виде ContinueCase оператор избыточный
Для меня он не избыточный, я указал пример использования. Аналогично и могу переделать выш пример:
Код:
$var = 4

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

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
А где в справке в Select и Switch упоминание ContinueCase?

Вот и я говорю, где?
Должно же быть:

asdf8 [?]
Ну тогда, в справке к функциям Select и Switch нужно указать, что Case выполняется если условие выполняется или в предыдущем Case имеется ContinueCase.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
AZJIO
Скорее всего, наверно так
Код:
If $var < 5 Then
 
Автор
A

asdf8

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

Но он легко заменим простым копипастом вместо ContinueCase кода из следующего Case.
А, если, при длинной цепочке Case, нужно проверить несколько условий - оказывается нечем.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
а так?
Код:
$var = 4

Select
    Case $var > 2
        ConsoleWrite('-> Case :' & $var & ' > 2' & @CRLF)
        If $var > 5 Then  ContinueCase
    Case $var > 5
        ConsoleWrite('-> Case :' & $var & ' > 5' & @CRLF)
    Case Else
        ConsoleWrite('-> Case Else' & @CRLF)
EndSelect


Но он легко заменим простым копипастом вместо ContinueCase кода из следующего Case
Да, но код бывает длинным и копипастить простыню не хочется, уж лучше функцию написать и вызывать из под Case
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]

Если бы после ContinueCase проверялась истинность условий в Case, то сработал бы еще случай Case Else.

PS: без Case я легко могу организовать последовательную проверку нескольких условий подряд, просто, если, никого не смущает подобная работа ContinueCase - я, больше вопросов не имею. Буду пользоваться тем, что есть.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
то сработал бы еще случай Case Else
Фактически если сработал предыдущий Case, то Case Else уже не сработает, а продолжить подвыражение также можно:
Код:
$var = 6

Select
    Case $var > 2
        ConsoleWrite('-> Case :' & $var & ' > 2' & @CRLF)
        If $var > 5 Then  ContinueCase
    Case $var > 5
        ConsoleWrite('-> Case :' & $var & ' > 5' & @CRLF)
		ContinueCase
    Case Else
        ConsoleWrite('-> Case Else' & @CRLF)
EndSelect


если, никого не смущает подобная работа ContinueCase - я, больше вопросов не имею
на офсайте можно предложить создать новую функцию, но думаю они спросят для какого случая и покажут пример использования имеющимися функциями. А усложнять Select и Switch теряя скорость её работы просто так не согласятся.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
Фактически если сработал предыдущий Case, то Case Else уже не сработает, а продолжить подвыражение также можно:

В общем случае будет так:

Код:
$var = 4
$iFlag = 1

Select
	Case $var > 2
		$iFlag = 0
		ConsoleWrite('-> Case :' & $var & ' > 2' & @CRLF)
		ContinueCase
	Case $var > 5
		If $var > 5 Then
			$iFlag = 0
			ConsoleWrite('-> Case :' & $var & ' > 5' & @CRLF)
		EndIf
		ContinueCase
	Case $var > 10
		If $var > 10 Then
			$iFlag = 0
			ConsoleWrite('-> Case :' & $var & ' > 10' & @CRLF)
		EndIf
		ContinueCase
	Case Else
		If $iFlag Then
			ConsoleWrite('-> Case Else' & @CRLF)
		EndIf
EndSelect



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

И так большую часть встроенных функций можно заменить другими, причем Select и Switch будут одними из первых в списке на замену.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
asdf8
Код:
Case $var > 5
        If $var > 5 Then

Разве это правильно? Два раза проверять одно и тоже...
понял смысл...
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
Разве это правильно? Два раза проверять одно и тоже...

Я про это и говорю, но, если этого не делать, не получится правильной последовательной проверки нескольких условий.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
А вот так?

Я поправил. Сверка один раз.

Ниже правильный вариант.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]

$iFlag всегда сбрасывается.
В предыдущих постах я немного попутал - Case Else должен срабатывать, если не сработал ни один другой случай.
 
Верх