ByRef & ByVal

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

ByRef & ByVal

Сообщение Крост » 16.03.2005 (Ср) 20:29

Может эт конечно и глупый вопрос, но зачем использовать ByRef и ByVal в аргументах функции? и в чём разница?

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 16.03.2005 (Ср) 20:31

ByRef - передача по ссылке. Поменял параметр внутри функции - изменения отразились на исходной переменной.
ByVal - передача по значению. Поменял параметр внутри функции - изменения так в ней и остались (передача параметра сопровождается копированием.) Для строк VB6 и Variant'ов этот метод самый медленный.
Моду создают модоки, а распространяют модозвоны.

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 16.03.2005 (Ср) 21:13

совет: для переменных, содержащих большие значения (например Война и Мир в одну переменную запихнул), то используй лучше ByRef - гораздо быстрее.

Морфий
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 119
Зарегистрирован: 11.01.2005 (Вт) 18:06

Сообщение Морфий » 16.03.2005 (Ср) 21:20

А по умолчанию по-моему ByVal используется :?:
Вот оно — счастье...

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 16.03.2005 (Ср) 21:24

Нет, в VB6 - ByRef. В VB.NET - ByVal, но там работа со строками и при ByVal, и при ByRef примерно равна по скорости.
Моду создают модоки, а распространяют модозвоны.

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 22.03.2005 (Вт) 21:20

Народ, вчитайтесь в объявление:

Public Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long


Как вам такое???
КАК API-функция (в нашем случае известная с vb3-детства) меняет значение параметра, переданного в процедуру ПО ЗНАЧЕНИЮ???

КАК можно замытить такое же??
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.03.2005 (Вт) 21:21

А ты обратил внимание, что передается строка?
Строки передаются иначе, чем числа.
Lasciate ogni speranza, voi ch'entrate.

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 24.03.2005 (Чт) 13:52

И как же передаются строки? Независимо от byref/val?
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 24.03.2005 (Чт) 14:56

"If you look at this exchange as a contract, Basic promises that when it passes a string with the ByVal attribute, the string will be null terminated and the address of the first character will be passed on the stack. The Windows API promises that if the string is constant (LPCTSTR), it will not modify the string or assume anything about the characters after the terminating null.

But this contract is less than bulletproof. Windows expects that the string will contain only one null character, the last. Basic makes no such promise. A passed string could have multiple null characters, which are perfectly legal in a Basic string. You as the programmer must ensure that the strings you pass don’t have inappropriate embedded nulls. As a practical matter, however, this usually isn’t a problem because few Basic programmers embed nulls in strings intended for Windows functions..."

(http://vb.mvps.org/hardcore/html/sendingstringstowindowsapi.htm)
Моду создают модоки, а распространяют модозвоны.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 70

    TopList