Параметры-переменные
Если перед именем формального параметра стоит ключевое слово var, то такой параметр есть параметр-переменная. Примерами таких параметров служат x1 и x2 в заголовке
procedure sq(a, b, c: real; var x1, x2: real);
Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой и не выражением).
При вызове процедур (функций) параметры-переменные обрабатываются так: для формального параметра используется именно та ячейка, которая содержит соответствующий фактический параметр.
Пример.
При вызове процедуры sq оператором sq(p, q, r, y, z) для переменныхx1 и x2 используются непосредственно те ячейки, которые отведены для y и z. Поэтому оператор присваивания x1 :=(-b + sqrt(d)) / (2 * a) засылает полученное значение в y.
Под формальные и фактические параметры-значения транслятор отводит разные области памяти. Поэтому результат выполнения процедуры может быть передан только через параметр-переменную.
-
var
-
a, b: integer;
-
-
procedure h(x: integer; var y: integer);
-
begin
-
x :=x + 1;
-
y :=y + 1;
-
writeln(x, y)
-
end;
-
-
begin
-
a :=0;
-
b :=0;
-
h(a, b);
-
writeln(a, b);
-
-
readln
-
end.
Результаты, выдаваемые процедурой h – 11; основная ветка программы выводит 01.
Разберем этот пример: фактический параметр a соответствует формальному параметру-значению x, а фактический параметр b – формальному параметру-переменной y. Под параметры a и x отведены две разные ячейки памяти, а под b и y– одна и та же ячейка.
При обращении к h(a, b) из ячейки a пересылается значение 0 в ячейку x, а в ячейку y засылается адрес ячейки b, содержащей 0, т.к. в процедуре h параметр x – это параметр-значение, а y – параметр-переменная.
При выполнении оператора x :=x + 1 в ячейку x прибавляется 1 и в ячейке xокажется 1, а в ячейке a по-прежнему 0.
Выполнение оператора y :=y + 1 имеет следующий смысл: «взять число из ячейки, адрес которой находится в y (т.е. из ячейки b), прибавить 1 и заслать в ту же ячейку (т.е. в b).
Поэтому в результате выполнения оператора y :=y + 1 значение ячейки bстанет 1. Оператор печати из процедуры выдаст содержимое ячейки x и ячейки y, т.е. 1 и 1. Оператор печати в программе напечатает содержимое a, которое осталось равным 0, и содержимое ячейки b, которое теперь равно 1.
Процедуры в Паскале допускают рекурсию, т.е. процедура может вызвать сама себя.
Если в процедуре p есть обращение к процедуре q, описанной ниже, то перед описанием p процедура q декларируется как forward: после заголовка процедуры qставится двоеточие, а затем ключевое слово forward. В этом случае параметры процедуры описываются только в операторе с forward. В заголовке самой процедуры параметры опускаются.
Пример.
-
procedure q(x: t1): forward;
-
-
procedure p(x: y);
-
begin
-
q(a)
-
end;
-
-
procedure q;
-
begin
-
p(b)
-
end;