Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Влияние скобок () при вызове функции/подпрограммы / 9 сообщений из 9, страница 1 из 1
24.07.2018, 11:57
    #39678165
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
Небольшая головоломка. Для развлечения. Вот пример

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
24.07.2018, 12:04
    #39678169
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
Joss, первом случае из-за скобок аргумент передаётся в процедуру по значению, второй случай правильно передается по ссылке
...
Рейтинг: 0 / 0
24.07.2018, 12:07
    #39678170
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
JossНа этом можно погореть.Ну ежели кто-то не умеет отличить переменную от выражения - пусть горит, жалко, что ли?
...
Рейтинг: 0 / 0
24.07.2018, 12:37
    #39678199
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
Всё верною «Самый простой способ превратить переменную в выражение - заключить ее в круглые скобки». на msdn.microsoft.com/en-us/library/aa263527(VS.60).aspx
Либо вот Force an Argument to Be Passed by Value (Visual Basic)
Но кто об этом помнит...
...
Рейтинг: 0 / 0
24.07.2018, 12:43
    #39678205
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
JossНо кто об этом помнит...те кто отписался...
...
Рейтинг: 0 / 0
24.07.2018, 12:48
    #39678212
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
... как сколько нас осталось мало... (с)

Вот ещё примерчик.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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
...
Рейтинг: 0 / 0
24.07.2018, 12:55
    #39678217
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
Рано нажал Опубликовать .

Когда str заключен в дополнительные круглые скобки в списке аргументов, setNewString процедура не может изменить его значение в вызывающем коде и MsgBox отображает "Cannot be replaced if passed ByVal" . Когда str не заключен в дополнительные круглые скобки, процедура может изменить его и MsgBox отображает "This is a new value for the inString argument."
...
Рейтинг: 0 / 0
24.07.2018, 13:09
    #39678233
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
Joss,

А чё нормально так.
Не охото писать функцию возвращающую значение.
А так в процедуре изменил значение входного параметр и передал его по ссылке (песня)
...
Рейтинг: 0 / 0
24.07.2018, 13:14
    #39678237
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Влияние скобок () при вызове функции/подпрограммы
Joss... как сколько нас осталось мало... (с)

Вот ещё примерчик.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 .
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Влияние скобок () при вызове функции/подпрограммы / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]