Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Параметры функций [D7, D2005, XP]


DenisNew ©   (2007-02-09 14:49:00) 

Добрый день.
Помогите пожалуйста понять каким образом параметры функций передаются. К примеру, есть функция

function EnumValues(const Param1: Boolean; var Param2: Word; Param3 : integer): boolean

Что такое "const", "var", и просто Param3 без никакого объявления?
Мое представление:
const Param1- параметр передается как есть и изменять его нельзя внутри этой функции.
var Param2- этот параметр можно изменять, причем после его изменения он будет возвращен в ту функцию, которая вызывала функцию EnumValues.
Param3- параметр скопируется в функции EnumValues и с ним можно проводить любые операции и только в самой EnumValues.

Вот с этими еще вроде более менее мне ясно.
Но когда я вижу в параметрах функций указатели с такими объявлениями const и var, мне становится совсем не ясно зачем оно.
к примеру :
procedure SetForm(const aForm: TForm);
почему const? имелось в виду что параметры формы изменять нельзя или же чтобы избежать копирования формы, с теми мыслями, что будет медленее без const?

А в этих процедурах что имеется в виду?
procedure WriteSome(const lpBuffer: Pointer);
procedure WriteSome2(var lpBuffer: Pointer);

Спасибо.


Loginov Dmitry   (2007-02-09 16:15:00) [1]

> А в этих процедурах что имеется в виду?
> procedure WriteSome(const lpBuffer: Pointer);
> procedure WriteSome2(var lpBuffer: Pointer);


В обеих процедурах передается одинаковым способом одно и то же значение (по ссылке). Однако модификатор const предписывает компилятору пресекать попытки изменения переменной lpBuffer. В некоторых случаях компилятор и вовсе может сгенерировать разный код в зависимости от наличия var, const и без оных. Поэтому например при передаче строки в процедуру (если изменять ее там не нужно), нужно использовать const. Другие варианты при обработке строки спровоцируют либо генерацию более медленного кода (при использовании var), либо заставять создать копию переданной строки (если не использовать модификаторы).


Игорь Шевченко   (2007-02-09 15:35:00) [2]


> Если TForm - это идентификатор класса, то по барабану, имется
> там префикс const или нет его.


Не по барабану


DenisNew   (2007-02-09 15:32:00) [3]

Теперь понял. Спасибо большое.


Desdechado   (2007-02-09 15:25:00) [4]

> procedure SetForm(const aForm: TForm); почему const? имелось
> в виду что параметры формы изменять нельзя или же чтобы
> избежать копирования формы, с теми мыслями, что будет медленее без const?
Это означает, что подменить форму другой в процедуре нельзя, а вот ее параметры менять можно, т.к. объекты передаются по ссылке.


Сергей М.   (2007-02-09 15:21:00) [5]


> почему const?


А бог его знает, что такое в дан.случае TForm)

Если TForm - это идентификатор класса, то по барабану, имется там префикс const или нет его.


> А в этих процедурах что имеется в виду?


procedure WriteSome(const lpBuffer: Pointer);

В процедуру передается копия значения неких данных указательного типа, изменять копию незьзя.

procedure WriteSome2(var lpBuffer: Pointer);

В процедуру передается копия адреса местонаходнения в памятизначения неких данных указательного типа, имея этот адрес можно изменять данные по этому адресу


Игорь Шевченко   (2007-02-09 15:02:00) [6]


> А в этих процедурах что имеется в виду?
> procedure WriteSome(const lpBuffer: Pointer);
> procedure WriteSome2(var lpBuffer: Pointer);
> procedure WriteSome2(lpBuffer: Pointer);


в первой процедуре внутри нее параметру lpBuffer нельзя присваивать значение.
во второй процедуре, значение, присвоенное в вызываемой процедуре параметру lpBuffer будет видно в вызывающей процедуре.
в третьей процедуре (это уже я добавил), значение переменной lpBuffer в вызываемой процедуре присваивать можно, но оно не будет видно в вызывающей процедуре.


Наверх

Титульная страница Поиск, карта сайта Написать письмо