Локальная переменная, передаваемая в параметрах, изменяется в функции, хотя и не является возвращаемым значением - PullRequest
0 голосов
/ 09 мая 2018

Переменная strCont отправляется в моей функции для заполнения документа, и я затем проверяю эту переменную, вместо того, чтобы иметь то же содержимое, что и перед отправкой (пустая строка в этом случае), теперь она имеет значение, которое Cont переменная взяла в функцию ("_ _ _ _ _ _ _ _ _ _").

strCont меняет значение в тот момент, когда Cont делает, что означает, что речь идет не о Return, а о том, что две переменные так или иначе связаны друг с другом.
Почему эти две переменные связаны? Все, что я знаю о функциях, говорит мне, что оно должно точно , а не работать так.

Заранее спасибо

Вот код:

Private Sub btnPrint_Click()
    Dim strClient2 As String, strTag As String, strCont As String
    '...
    strCont = strClient2
    strTag = "client2"
    Call Filling(strCont, strTag)
    If strCont = "" Then Call Filling("", "and2")
    '...
End Sub

Функция

Function Filling(Cont As String, whatev As String)
    'other ifs...
    If Cont = "" Then Cont = "_ _ _ _ _ _ _ _ _ _"
    'fills doc...
End Function

Конечно, проблему можно избежать (и она есть в моей программе), просто передав копию переменной в параметрах, но это происходит не так, как предполагалось, и я просто не понимаю, почему.

1 Ответ

0 голосов
/ 09 мая 2018

Хотя мы думаем о строках как о «простых», они на самом деле не «под одеялом». В действительности это «ссылочные типы» - вы установили два «указателя» для строк на один и тот же адрес в памяти, что делает их полностью эквивалентными. (Это не произойдет с числами.) Строки передаются неявно «ByRef», что означает, что они могут быть изменены в другой процедуре.

Измените функцию, чтобы получить строки явно ByVal. Таким образом, то, что входит в функцию, будет изменено только в функции .

Sub btnPrint_Click()
    Dim strClient2 As String, strTag As String, strCont As String
    '...
    strCont = strClient2
    strTag = "client2"
    Call Filling(strCont, strTag)
    If strCont = "" Then Call Filling("", "and2")
    '...
End Sub

Function Filling(ByVal Cont As String, ByVal whatev As String)
    'other ifs...
    If Cont = "" Then Cont = "_ _ _ _ _ _ _ _ _ _"
    'fills doc...
End Function

Полезные ссылки:

...