IsMissing для не варианта

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

IsMissing для не варианта

Сообщение arthur2 » 29.04.2014 (Вт) 14:26

Есть функция с опциональными параметрами. Как узнать, был послан конкретный параметр в функцию или нет? IsMissing работает только для варианта.
Артур
 
   

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

Re: IsMissing для не варианта

Сообщение iGrok » 29.04.2014 (Вт) 14:55

А "простой" способ, с заданием "невалидного" значения параметра по умолчанию, и последующей проверки валидности не катит?
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: IsMissing для не варианта

Сообщение arthur2 » 29.04.2014 (Вт) 19:17

Не, ну это более-менее очевидный вариант. Я имел ввиду, чтобы придумать какой-нибудь трюк.

Мысль была такая: перед вызовом функции в стек по очереди укладываются все параметры. Если наш опциональный параметр байвал, то безнадега. А если байреф, то где-то выделяется место под значение по умолчанию, а в стек кладется его адрес. У меня было подозрение, что место под значение выделяется тоже где-то в стеке и можно как-то вычислить его адрес по адресам других параметров.

По меньшей мере, если в функции несколько опциональных параметров byref, то адреса их значений по умолчанию идут подряд. Не знаю только, на сколько на это можно положиться :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: IsMissing для не варианта

Сообщение Хакер » 29.04.2014 (Вт) 21:04

arthur2 писал(а):Я имел ввиду, чтобы придумать какой-нибудь трюк.

Никак.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: IsMissing для не варианта

Сообщение The trick » 29.04.2014 (Вт) 21:18

Они просто передают значение по умолчанию, если ты ничего не передаешь.
Получить адреса можно, но что это даст?
Код: Выделить всё
Private Sub Test(ByVal z As Long, Optional ByRef q As Long, Optional ByRef s As Single)
    Dim lplpq   As Long
    Dim lplps   As Long
   
    lplpq = VarPtr(z) + 4
    lplps = lplpq + 4

End Sub
UA6527P

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: IsMissing для не варианта

Сообщение arthur2 » 30.04.2014 (Ср) 4:52

Кривоус Анатолий писал(а):Получить адреса можно, но что это даст?

Мысль была, что если адрес значения по умолчанию совпадает с адресом параметра, значит параметр не был задан, а если не совпадает, то задан
Артур
 
   

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: IsMissing для не варианта

Сообщение Vi » 30.04.2014 (Ср) 8:30

arthur2 писал(а):Есть функция с опциональными параметрами. Как узнать, был послан конкретный параметр в функцию или нет? IsMissing работает только для варианта.

Необязательные параметры на то и необязательные, что они необязательны в описании вызова, но они всё равно обязательно будут заданы при вызове. Нет способа в реализации метода f отличить вызов f(p1,,p3) и f(p1,7,p3), если p2 имеет умалчиваемое значение 7, - это всё просто нужно учитывать при проектировании. Такие параметры, скорее, отражают "меньше писанины", а не какую-то специфическую функциональность сервера.

FYI, cамо описание необязательных параметров отличается для варианта и типизированных данных. В первом случае [optional], во втором - [defaultvalue(<значение>)].

PS
Есть способ отличить такие вызовы на уровне Invoke, потому что там все параметры передаются через VARIANT, и отсутствующие параметры кодируются специальным образом (в точности как [optional] для вариантов) и перекодируются в нужные значения при вызове кода метода в обработчике Invoke.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: IsMissing для не варианта

Сообщение arthur2 » 02.05.2014 (Пт) 19:39

Vi писал(а):Нет способа в реализации метода f отличить вызов f(p1,,p3) и f(p1,7,p3)

В общем, фейл :) Два эти вызова, на сколько я понял, попросту одинаково скомпилируются
Артур
 
   


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList  
cron