Параметры, описанные в заголовке подпрограммы, называются формальными.
Примеры:
(value: integer)
(X, Y: Real)
(st:string; n:integer; c,fill:char) |
Список формальных параметров – это последовательность объявлений однотипных параметров. Объявления отделяются друг от друга точкой с запятой. Каждое объявление состоит из списка имен параметров, символа ‘:’ и указания их типа. Внутри объявления имена параметров разделяются запятой. Имя параметра – это корректный идентификатор.
Существует два способа передачи параметра в подпрограмму: по значению(параметры-значения) или по ссылке. Для передачи параметра по ссылке рядом с именем параметра используется одно из зарезервированных слов: var (параметры-переменные), const (параметры-константы), out (выходные параметры). Например:
(var S: string; X: Integer)(const P; I: Integer) |
Чтобы почувствовать разницу в способах передачи параметров, обратимся к следующим примерам (из Help):
function DoubleByValue(X: Integer): Integer; // X is a value parameter
begin
X := X * 2;
Result := X;
end;
function DoubleByRef(var X: Integer): Integer; // X is a variable parameter
begin
X := X * 2;
Result := X;
end;
|
Эти функции возвращают одинаковый результат, но только вторая может изменять значение параметра, переданного в подпрограмму. Вызовем эти функции:
Var
I, J, V, W: Integer;
begin
I := 4;
V := 4;
J := DoubleByValue(I); // J = 8, I = 4
W := DoubleByRef(V); // W = 8, V = 8
end;
|
Параметры-значения можно рассматривать как локальные переменные, которые получили начальное значение при вызове подпрограммы. Если вы передали какую-нибудь переменную как параметр-значение, то подпрограмма создает копию переменной. Изменения этой копии не приводят к изменению исходной переменной и утериваются после завершения работы подпрограммы.
Параметры-переменные похожи скорее на указатели. Изменения такого параметра внутри тела процедуры или функции сохраняются после завершения работы подпрограммы и возвращаются в вызывающую программу.
(схемка)
Назначение зарезервированных слов:
Ключевое слово
| |
Var
| Можно использовать для передачи данных в подпрограмму и для получения данных из подпрограммы
|
Const
| Нельзя изменять значение в теле подпрограммы. Похож на локальную переменную только для чтения.
|
Out
| Нельзя использовать для передачи данных в подпрограмму. Используется только для получения данных из подпрограммы.
|
Для параметров-значений и параметров-констант возможно указание в заголовке процедуры или функции значения по умолчанию. Для этого в объявлении параметра после типа используется ‘=’ и указывается само значение (константное выражение совместимого типа). Например:
(var S: string; X: Integer = 5)(const P, I: Integer; const M: real = 4.5) |
Для параметров, передающихся по ссылке, можно не указывать тип параметра. Такие параметры называются нетипизированными. Параметр-значение обязательно типизирован. Примеры:
(var S, X; out Z)(const P, I; var M) |
Внутри подпрограммы непизированные параметры несовместимы ни с какими типами. Необходимо выполнить приведение типов.