Синтаксис спецификации процедуры:
procedure <имя>(<список формальных параметров>);
Входные параметры (аргументы) процедуры передаются значением или по адресу, а выходные параметры (результаты) – по адресу.
Вызов процедуры – это отдельный оператор, который содержит имя процедуры и список фактических параметров. Например:
P(x); {это вызов процедуры P с фактическим параметром x}
В качестве примера использования процедуры рассмотрим возведение переменной base в степень exponent – baseexponent (аналогично power).
В этом случае, наряду с аргументами base и exponent, которые передаются по значению, необходимо добавить в спецификацию процедуры выходной параметр (результат),который должен быть передан по адресу (в примере это pow).
procedure power(base, exponent: real; var pow: real);
Begin
pow:= exp(exponent * ln(base));
end;
Пример вызова процедуры power:
power(3, 5, j);
writeln(j);
Значения параметров по умолчанию
Формальным параметрам в спецификации подпрограммы можно задать значения, которые будут приниматься по умолчанию, если в операторе вызова подпрограммы отсутствуют соответствующие этим формальным параметрам фактические параметры.
Формальные параметры, имеющие значения по умолчанию, должны быть объявлены друг за другом и должны находиться в конце спецификации подпрограммы.
Пример задания значений параметров по умолчанию:
function power(base: real; exponent: real = 2): real;
Begin
result:= exp(exponent * ln(base));
end;
При вызове power(base, 3) параметр exponent получит значение 3 и результатом функции будет base3. В случае вызова power(base) – exponent получит значение 2 (значение по умолчанию) и результатом функции будет base2.
Перегрузка функций
В языке Object Pascal несколько функций могут иметь одно и то же наименование. Для того чтобы компилятор мог определить, какую именно из этих функций вызвать, одноименные функции должны иметь разные параметры и описание overload – перегруженные.
Пример перегруженных функций:
function Divide (x, y: real): real; overload;
Begin
if y<>0 then
result:= x / y;
end;
function Divide (x, y: integer): integer; overload;
Begin
if y<>0 then
result:= x div y;
end;
При вызове Divide (2.4, 2.0) будет вызвана первая функция, при вызове Divide (4, 2) – вторая.