Загадка про Select Case

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Загадка про Select Case

Сообщение tyomitch » 17.07.2007 (Вт) 21:50

(Вроде не баян?)

В каких случаях эти фрагменты кода приводят к разным результатам?

Код: Выделить всё
Select Case x
Case y, z: MsgBox "Ура!"
End Select


Код: Выделить всё
Select Case x
Case z, y: MsgBox "Ура!"
End Select
Изображение

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 17.07.2007 (Вт) 22:59

:shock: :shock: :shock:
А разве могут быть разные результаты?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 17.07.2007 (Вт) 23:26

Ну когда 'у' в одном случае набрана в русской раскладке, а в другом в аглицкой?
(хотя, если бы так, то вопрос был бы не в этом разделе...)
Salus populi suprema lex

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.07.2007 (Вт) 23:36

Наверняка оптимизация хромает. Но не факт :)
см. http://wasm.ru/article.php?article=1009002

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.07.2007 (Вт) 23:51

Мммм... Когда y и z -- экземпляры объектов, имеющие дефолтные свойства, причём y помнит внутри себя ссылку на z, а в коде его дефолтного property get стоит изменение значения, хранимого в z, так что последующий вызов дефолтного свойства z вернёт не то же значение, которое вернулось бы без предварительного вызова дефолтного свойства y.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 0:41

GSerg, чересчур изощрённо :-)
Можно куда проще.
Изображение

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 1:35

...в том случае, если

y=f(z)
z=f(y)

да?

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 18.07.2007 (Ср) 1:59

GSerg
Жжош
Подпись проходит рефакторинг

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 5:07

t116, не понял. Можно пример? :-?
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.07.2007 (Ср) 8:27

tyomitch писал(а):t116, не понял. Можно пример? :-?


Он хотел лишь сказать что Y и Z функции...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 8:52

Ну пусть функции, а пример-то какой?
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.07.2007 (Ср) 10:42

dim N

function Y()
Y=N
end function

function Z()
N=N+1
Z=N
end function

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 10:52

ок, а X?
Изображение

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 12:09

Ну, от X тут мало что зависит.

Пример, где X - известное число.
Подобрать его можно экспериментально, решив систему уравнений с переменными X, fY, fZ.

Первый вариант:

Код: Выделить всё
Dim X, Y, Z

Main()

X = 12

Select Case X
Case fY(), fZ(): Msgbpx ("Ура!")
End Select

End Sub

Function fY()
Y = 4 * Z
fY = Y
End Function

Function fZ()
Z = Y / 2
fZ = Z
End Function



Второй вариант:
Код: Выделить всё
Dim X, Y, Z

Main()
X = 12

Select Case X
Case fZ(), fY(): Msgbpx ("Ура!")
End Select

End Sub

Function fY()
Y = 4 * Z
fY = Y
End Function

Function fZ()
Z = Y / 2
fZ = Z
End Function
Последний раз редактировалось t116 18.07.2007 (Ср) 12:18, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 12:13

У меня оба варианта работают одинаково (не выдают никаких сообщений); у тебя иначе?
Изображение

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 12:27

Вот так:

Код: Выделить всё
Dim X, nY, nZ

Sub Main()

X = 4
nY = 1
nZ = 1

Select Case X
Case Y(), Z(): MsgBox ("Ура!")
End Select

End Sub

Function Y()
nY = 4 * nZ
Y = nY
End Function

Function Z()
nZ = nY / 2
Z = nZ
End Function


Если заменить Case Y(), Z() на Case Z(), Y() то результат будет отличаться.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 12:29

Ок, зачтено....

Но мой вариант всё равно был проще :-)

Код: Выделить всё
Sub Main()

Dim X, Y, Z
X = 42
Y = X
Z = CVErr(X)

Select Case X
Case Y, Z: MsgBox ("Ура!")
End Select

End Sub
Изображение

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 12:36

Ха! До такого я бы не додумался! :D
Последний раз редактировалось t116 18.07.2007 (Ср) 13:03, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 13:00

Второй раунд: придумать пример, когда Y и Z -- константы ;-)
Изображение

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 13:32

Окей! ... :twisted:

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 13:35

Вот:

Код: Выделить всё
Const Y = 10
Const Z = "Лалалала"
Dim X As Integer

Sub Main()

X = 10

Select Case X
Case Y, Z: MsgBox "Оба!"
End Select


End Sub

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2007 (Ср) 13:50

Угу.
Изображение

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 13:55

Кстати, по поводу первого раунда. Этот вариант еще проще твоего:

Код: Выделить всё
Sub Main()

X% = 10
Y$ = "Привет"
Z% = 10

Select Case X
Case Y, Z: MsgBox "Пока!"
End Select

End Sub

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 13:58

А этот так вообще:


Код: Выделить всё
Sub Main()

Dim X%, Y%, Z$
Select Case X
Case Y, Z: MsgBox "Ура!"
End Select

End Sub


ЗЫ. Будет 3й раунд?
ЗЫЫ. Поспешил. Это мог бы быть третий раунд: решить задачу не используя оператор "=". :D

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 18.07.2007 (Ср) 14:09

Хм.. А в чем прикол-то? Ну подсовываете вы ему аргумент неправильного типа.. Ну ругается он на него.. =)

ИМХО пример с ф-циями от t116 и объектами от GSerg более "правильный"..
label:
cli
jmp label

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 18.07.2007 (Ср) 14:17

iGrok писал(а):Хм.. А в чем прикол-то? Ну подсовываете вы ему аргумент неправильного типа.. Ну ругается он на него.. =)

ИМХО пример с ф-циями от t116 и объектами от GSerg более "правильный"..


Прикол в том, что результат может быть каким угодно. В условии не сказано, что результат не может быть "ошибкой". Задача на логику.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 19.07.2007 (Чт) 14:57

Вот собственно еще один вариант, с использованием прозрачных указателей

Код: Выделить всё
Option Explicit

Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal pDst As Long, ByVal Src As Byte)
Public Sub CreateMagic(Pointer, PointedTo)
Dim lPtr As Long: lPtr = Pointer
Pointer = VarPtr(PointedTo) + 8
PutMem1 VarPtr(Pointer) + 1, &H40
PutMem1 VarPtr(PointedTo) + 1, &H40
Pointer = lPtr
End Sub

Sub s(pc, z)
Dim x As Long, y As Long
pc = VarPtr(y) - 36
z = 0&
Call CreateMagic(pc, z)
x = 10
y = Not x
z = x
Select Case x
Case y, z:  MsgBox "Ура!"
End Select
Select Case x
Case z, y: MsgBox "Ура!"
End Select
End Sub
Sub Main()
Dim pc As Variant, z As Variant
Call s(pc, z)
End Sub

Возможно, я где-то ошибся в плане VarPtr(y) - 36.
Но по идее, после первого сравнения изменяется стек и наше значение тоже меняется.
الفيجوال بيسك الرابح


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 40

    TopList