Что нового

Select..Case некорректная работа.

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
AutoIt: 3.3.6.1
SciTe: Version 1.79 Jul 16 2009 18:30:31 (Отдельно скачанный с оффсайта, со всякими доп фишками)
Если взять вот этот код:
Код:
MsgBox(0,0,TestFunc(0))

Func TestFunc($ToCheck)
	Select
		Case $ToCheck = "test0" Or $ToCheck = 2
			Return 0

		Case $ToCheck = "test1" Or $ToCheck = 1
			Return 1

		Case $ToCheck = "test2" Or $ToCheck = 0
			Return 2
	EndSelect
EndFunc

То теоретически при запросе
Код:
MsgBox(0,0,TestFunc("test0"))

и
Код:
MsgBox(0,0,TestFunc(0))

MsgBox отобразит нам 0
Я полагаю так же должно быть если в обращение в функцию мы подставим "test1" или же 1. Но если проверить, то при вот такой вот строке:
Код:
MsgBox(0,"Test",TestFunc("test1"))

мы видим MsgBox с "0" внутри, в то время как подставив
Код:
MsgBox(0,"Test",TestFunc(1))

мы увидим MsgBox с 1 внутри.

Далее если мы например изменим код на такой:
Код:
MsgBox(0,"Test",TestFunc("test2"))

Func TestFunc($ToCheck)
	Select
		Case $ToCheck = "test0" Or $ToCheck = 2
			Return 0

		Case $ToCheck = "test1" Or $ToCheck = 0
			Return 1

		Case $ToCheck = "test2" Or $ToCheck = 1
			Return 2
	EndSelect
EndFunc

То теоретически при запросах $test0 или 2, мы должны видить MsgBox с 0
при запросах test1 или 0 мы должны видить MsgbBox с 1
при запросах test2 или 1 мы должны видить MsgBox с 2
А теперь проверим это на деле
MsgBox(0,"Test",TestFunc("test0")) отображает 0
MsgBox(0,"Test",TestFunc(2)) отображает 0

MsgBox(0,"Test",TestFunc("test1")) отображает 1
MsgBox(0,"Test",TestFunc(0)) отображает 0


MsgBox(0,"Test",TestFunc("test2")) отображает 1
MsgBox(0,"Test",TestFunc(1)) отображает 2




Мне кажется или работать должно чуууть-чуть не так? При обращении в функцию пробовал использовать String, не помогло :blink:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Belfigor
У меня, вроде, так правильно отрабатывает:
Код:
MsgBox(0, 0, TestFunc(0))

Func TestFunc($ToCheck)
	If Not IsString($ToCheck) Then
		$ToCheck = String($ToCheck)
	EndIf
	Select
		Case $ToCheck = "test0" Or $ToCheck = 2
			Return 0

		Case $ToCheck = "test1" Or $ToCheck = 1
			Return 1

		Case $ToCheck = "test2" Or $ToCheck = 0
			Return 2
	EndSelect
EndFunc   ;==>TestFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Вероятно AutoIt поизводит сравнение следующим образом (если разные типы):

Код:
$iFirst = Int('A')
$iSecond = Int(0)

ConsoleWrite("$iFirst = " & $iFirst & @CRLF)
ConsoleWrite("$iSecond = " & $iSecond & @CRLF)
ConsoleWrite("(" & $iFirst & " = " & $iSecond & ") = " & ($iFirst = $iSecond) & @CRLF)
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Yashied сказал(а):
Вероятно AutoIt поизводит сравнение следующим образом (если разные типы):

Код:
$iFirst = Int('A')
$iSecond = Int(0)

ConsoleWrite("$iFirst = " & $iFirst & @CRLF)
ConsoleWrite("$iSecond = " & $iSecond & @CRLF)
ConsoleWrite("(" & $iFirst & " = " & $iSecond & ") = " & ($iFirst = $iSecond) & @CRLF)
Так и есть:
Код:
MsgBox(0,0,TestFunc(1))

Func TestFunc($ToCheck)
    Select
        Case $ToCheck = String("test0") Or $ToCheck = String(2)
            Return 0

        Case $ToCheck = String("test1") Or $ToCheck = String(0)
            Return 1

        Case $ToCheck = String("test2") Or $ToCheck = String(1)
            Return 2
    EndSelect
EndFunc
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Ну я собственно избавился от сей неприятности просто убрав 0 из вариантов обработки, отсчет теперь начинается с 1
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Хотя на мой взгляд, правильнее было бы не строку приводить к числовому значению, а наоборот.
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Yashied сказал(а):
Хотя на мой взгляд, правильнее было бы не строку приводить к числовому значению, а наоборот.
Я из гуи чере GuiCtrlRead беру значения
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712

SyDr

Сидра
Сообщения
651
Репутация
158
Yashied [?]
Вероятно AutoIt поизводит сравнение следующим образом (если разные типы):
Почти :smile: Там используется Number()

[?]
Хотя на мой взгляд, правильнее было бы не строку приводить к числовому значению, а наоборот.
Number() вроде быстрее работает, чем String()
 
Верх