Что такое ByVal и для чего он нужен.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Что такое ByVal и для чего он нужен.

Сообщение Gigahard » 24.10.2004 (Вс) 12:15

Раньше думал, что данный префикс предотвращает изменение значения переменной вне функции. Выяснил я это вот на таком примере:
Код: Выделить всё
Dim iOne As Integer
Dim iTwo As Integer
'-----------------------------------------
Private Sub test1(ByVal param As Integer)
param=param + 1
MsgBox "Inside value: " & param
End Sub
'-----------------------------------------
Private Sub test2(param As Integer)
param=param + 1
MsgBox "Inside value: " & param
End Sub

'-----------------------------------------
Private Sub Form_Load()
iOne=1
iTwo=1
End Sub
'-----------------------------------------
Private Sub cmdByVal_Click()
test1 iOne
MsgBox "Outside value: " & iOne
End Sub
'-----------------------------------------
Private Sub cmdCommon_Click()
test2 iTwo
MsgBox "Outside value: " & iTwo
End Sub


На этом примере получается, что при использованиии префикса ByVal в функцию передается лишь значение переменной, но не сама переменная. И соответственно значение переменной изменяется только внутри функции. Я прав?

Только вот недавно начал изучать winsock API, так там есть API функция для получения имени локального хоста.

Вот ее синтаксис:
Код: Выделить всё
Public Declare Function gethostname Lib "ws2_32.dll" (ByVal host_name As String, ByVal namelen As Long) As Long


В данном случае функция меняет параметр host_name как бы возвращая результат. После этого я окончательно запутался в назначении ByVal. Как же так? В первом примере этот префикс предотвращает изменение переменной, в случае с gethostname нет.
Пожалуйста объясните ситуацию.
Старый глюк лучше новых двух!

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

Сообщение GSerg » 24.10.2004 (Вс) 12:21

Всё правильно. Просто со ссылочными и со структурными объектами ByVal работает по-разному.

Для структурного объекта - это передача копии объекта.
Для ссылочного - это передача копии указателя на объект. В результате ты не сможешь заставить переданный параметр ссылаться на другой объект, но изменить свойства объекта сможешь.

Особенность маршалинга при работе со String через API в том, что по ByVal передаётся указатель на сами данные, а при ByRef передаётся указатель на указатель... В общем, просто запомни, что строки в API нуно передавать всегда ByVal, и это совсем не означает запрет на изменение, а совсем даже наоборот :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kazah_
Обычный пользователь
Обычный пользователь
 
Сообщения: 99
Зарегистрирован: 13.01.2003 (Пн) 18:37
Откуда: Russia

Сообщение kazah_ » 25.10.2004 (Пн) 15:47

какие все умные...
Mr DEN - THE WAY YOU KNOW / Мр. ДЕН - Ваш Путь к Познанию!

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

Сообщение FaKk2 » 25.10.2004 (Пн) 16:58

Дык шаманы 8)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Цукерман
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 17.11.2004 (Ср) 22:29

Сообщение Цукерман » 17.11.2004 (Ср) 22:45



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

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

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

    TopList