logo
Методичка_Delphi_Ч1

Передача параметров по наименованию

При передаче параметров по наименованию в подпрограмму передаются адреса фактических параметров. Поэтому такой способ передачи называется еще передачей параметров по адресу или по ссылке.

При таком способе передачи в качестве фактических параметров можно передавать только переменные. Выражение и даже отдельное число или символ передать по наименованию нельзя.

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

Но побочный эффект имеет и положительную сторону. Передачу параметров по наименованию можно использовать для возвращения результатов работы подпрограммы через фактические параметры. Такой способ возвращения особенно эффективен, когда требуется вернуть несколько параметров. Ведь функция возвращает только одно значение.

Выше, в пункте 3.1.1 уже рассматривался пример процедуры с передачей параметра по наименованию.

Рассмотрим еще один пример использования передачи параметров по наименованию для возвращения результатов работы подпрограммы.

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

Procedure getKoef (var kA, kB, kC:Real);

begin

kA:=strToFloat(frmSubroutine.edtA.Text);

kB:=strToFloat(frmSubroutine.edtB.Text);

kC:=strToFloat(frmSubroutine.edtC.Text);

end;

В этой процедуре содержимое текстовых полей преобразуется в вещественные числа, и результаты преобразования присваиваются формальным параметрам, которые объявлены как передаваемые по наименованию. На это указывает слово var перед именами параметров.

Обращение к этой процедуре происходит в другой процедуре, которая обрабатывает событие onClick кнопки «Расчет по формуле». Фрагмент этой процедуры приведен ниже.

До вызова процедуры значения переменных a, b, c были неопределенными (мусор). При вызове процедуры getKoef адреса этих переменных были переданы в качестве фактических параметров. При выполнении процедуры, по этим адресам были записаны результаты преобразования данных. В результате, после окончания работы процедуры getKoef переменные a, b, c приобрели новые значения, которые были вычислены в процедуре

procedure TfrmSubroutine.btnCalculateRootsClick(Sender: TObject);

var a, b, c :Real;

begin

// До вызова процедуры getKoefKvUr

// значения переменных a,b,c не определены

getKoef(a,b,c);

// После вызова процедуры значения переменных

// a,b,c соответствуют содержиммому тектовых полей

end;