ByVal, ByRef? Что это такое?

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

ByVal, ByRef? Что это такое?

Сообщение vbStr » 01.07.2005 (Пт) 18:56

Во всех декларациях WinApi-функций встречаются ключевые слова ByVal и ByRef. Знаю, что они означают "по значению" и "по ссылке", но где и как их можно использовать? Подскажите? Если можно с примером.
Часто в моих кодах использую кучу дублирующих переменных. Чувствую, что это не совсем правильно - плодить это стадо. Думаю, применением передач значений "по ссылке" можно упростить код. Но не знаю как. Спасибо.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.07.2005 (Пт) 20:15

GSerg писал(а):ByVal и ByRef - два способа передачи параметров. Дело в том, что VB не поддерживает указатели явно, но всё-таки поддерживает. Передача параметра ByRef (она используется по умолчанию, если не указать способ передачи) - это передача указателя на значение. Принимающая процедура должна будет при каждом обращении к параметру получать его значение по указателю. Передача ByVal - передача не указателя, а самого значения. Принимающая функция не должна зырить в указатель, она сразу имеет значение. В языке C, к примеру, передача указателя на целое - int* a, а передача самого целого - int a. В VB передача указателя на целое - byref a (или просто а), передача самого целого - byval a.
Передача ByVal имеет смысл при числовых значениях, поскольку указатель обычно имеет размер 4 байта, передаваемое число (к примеру, Long) - тоже, поэтому можно сразу толкать его, так быстрее. А передача ByRef актуальна при передаче указателей на объекты, структуры и массивы (всё это нельзя передать ByVal), и, кроме того, в тех случаях, когда вызываемая процедура должна иметь возможность изменить переданный параметр так, чтобы это изменение возымело эффект в вызывающей процедуре.

FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Re: ByVal, ByRef? Что это такое?

Сообщение FSO » 01.07.2005 (Пт) 20:24

С ключевым словом byVal функция Dll работает с преобразованной формой сток (С) и все изменения отображаются в исходной строке.

без ByVal ты работаешь непосредственно со строкой VB. т.е. стоковая переменная преобразуется на строку OLE(BSRT).

Без кл. слова ByVal практически всегда нарушается содержимое памяти, и возникают фатальные исключения



Думаю, применением передач значений "по ссылке" можно упростить код.

хм... я так не думаю :((((
работать сразу со строкой VB муторное дело. В книги Дана Эпплмана подробно все объясняется на пальцах и на примерах (Примеры есть... если хочешь могу выложить или на мыло кинуть)...

FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Сообщение FSO » 01.07.2005 (Пт) 20:26

2A.A.Z.

блин опоздал :))))

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.07.2005 (Пт) 22:15

FSO, а почему ты ограничился рассмотрением только строк? :-|
Изображение

FSO
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 17.04.2005 (Вс) 11:50

Сообщение FSO » 01.07.2005 (Пт) 22:22

tyomitch писал(а):FSO, а почему ты ограничился рассмотрением только строк? :-|


Потому что вопрос был поставлен не конкретно. Ну и я решил объяснить это на строках...
ЗЫ: :?: Может я в чем то неправ??? :roll: :roll: :roll:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.07.2005 (Сб) 2:02

Строки - плохой пример: с ними всё не по-нормальному.
Объяснил бы лучше на Long-ах... Там нету никаких "преобразований".
Изображение


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

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

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

    TopList