Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Влияние скобок () при вызове функции/подпрограммы  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4833
Небольшая головоломка. Для развлечения. Вот пример

Sub Foo()

    Dim str As String

    str = "Hello"

    Bar (str)
    Debug.Print str 'prints "Hello" because str is evaluated and a copy is passed

    Bar str 'or Call Bar(str)
    Debug.Print str 'prints "Hello World"

End Sub

Sub Bar(ByRef param As String)

    param = param + " World"

End Sub
Кажется всё просто, но разные результаты. В первом случае печатается "Hello", во втором "Hello World". На этом можно погореть. Кто знает, почему? Ответ прост. Но кто докопается?

-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
24 июл 18, 11:57    [21597302]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4093
Joss, первом случае из-за скобок аргумент передаётся в процедуру по значению, второй случай правильно передается по ссылке
24 июл 18, 12:04    [21597351]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18751
Joss
На этом можно погореть.
Ну ежели кто-то не умеет отличить переменную от выражения - пусть горит, жалко, что ли?
24 июл 18, 12:07    [21597363]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4833
Всё верною «Самый простой способ превратить переменную в выражение - заключить ее в круглые скобки». на msdn.microsoft.com/en-us/library/aa263527(VS.60).aspx
Либо вот Force an Argument to Be Passed by Value (Visual Basic)
Но кто об этом помнит...
24 июл 18, 12:37    [21597583]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4093
Joss
Но кто об этом помнит...
те кто отписался...
24 июл 18, 12:43    [21597623]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4833
... как сколько нас осталось мало... (с)

Вот ещё примерчик.
Sub Test()
Dim str As String
str = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox (str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox (str)
End Sub

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox (inString)
End Sub
24 июл 18, 12:48    [21597663]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4833
Рано нажал Опубликовать.

Когда str заключен в дополнительные круглые скобки в списке аргументов, setNewString процедура не может изменить его значение в вызывающем коде и MsgBox отображает "Cannot be replaced if passed ByVal". Когда str не заключен в дополнительные круглые скобки, процедура может изменить его и MsgBox отображает "This is a new value for the inString argument."
24 июл 18, 12:55    [21597697]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 1609
Joss,

А чё нормально так.
Не охото писать функцию возвращающую значение.
А так в процедуре изменил значение входного параметр и передал его по ссылке (песня)
24 июл 18, 13:09    [21597787]     Ответить | Цитировать Сообщить модератору
 Re: Влияние скобок () при вызове функции/подпрограммы  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 1609
Joss
... как сколько нас осталось мало... (с)

Вот ещё примерчик.
Sub Test()
Dim str As String
str = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox (str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox (str)
End Sub

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox (inString)
End Sub

У Гетца целая глава на эту тему как грамотно использовать ByRef и ByVal .
24 июл 18, 13:14    [21597809]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить