Next:6.1.5
Вычисление единственного значения-функции
Up:6.1
Подпрограммы: процедуры и функции
Previous:6.1.3
Изменение действия-выходные параметры
OutFPSection = var ident { "," ident } ":" FormalType.
Рис. 6.4. Спецификация выходных формальных параметров
При вызове процедуры в фактических параметрах вычисляются все индексные выражения, если они есть, а полученные переменные связываются с соответствующими выходными формальными параметрами. Эта связь имеет место до тех пор, пока не завершится выполнение данного вызова, и любые действия с формальными параметрами-переменными, выполняемые в это время внутри процедуры, в действительности выполняются над соответствующими переменными, подставляемыми в качестве фактических параметров (в частности, если фактический параметр не содержит индексов, то он и есть та переменная, с которой связывается соответствующий формальный параметр). Например, в программе МаксТри, приведенной ниже, при первом вызове процедуры Зам обмениваются своими значениями переменные и , а при втором -- и .
module МаксТри;
(* Максимум из трех целых *)
var X,Y,Z : integer;
procedure Зам(var A : Integer; var
B : Integer);
var C : integer;
begin C := A; A := B; B := C end Зам;
begin
read(X,Y,Z);
if X
Y then Зам(X,Y) end; (*
*)
if X
Z then Зам(X,Z) end; (**)
write(X)
end МаксТри.
Рассмотрим вызов Зам(K, M[K]), в котором
-- это целая переменная, а
-- переменная типа array[1..100] of integer. Поскольку индексные
выражения в фактических параметрах вычисляются до связывания параметров,
справедливо свойство
Зам
Выходные параметры -- важное и мощное средство программирования, однако возможность доступа к одной и той же переменной через разные имена, возникающая при подстановке выходных параметров, таит в себе определенную опасность. Нужно тщательно следить за тем, чтобы при вызовах два разных формальных параметра не были связаны с одной и той же переменной или ее компонентами. Опасности, которые могут проявиться при нарушении этого правила, показаны ниже, на примере процедуры УМН для умножения двух матриц.
type MATР = array 2 , 2 of integer;
procedure УМН (var X, Y, Z : MATР);
begin
Z[1,1] := X[1,1]
Y[1,1] + X[1,2]
Y[2,1];
Z[1,2] := X[1,1]
Y[1,2] + X[1,2]
Y[2,2];
Z[2,1] := X[2,1]
Y[1,1] + X[2,2]
Y[2,1];
Z[2,2] := X[2,1]
Y[1,2] + X[2,2]
Y[2,2];
end;
Пусть даны переменные и типа MATР и матрицы
Тогда справедливы следующие утверждения
УМН
УМН
УМН
С другой стороны, если у процедуры УМН два первых параметра сделать параметрами значениями, т.е. изменить заголовок на
procedure УМН (X, Y: МАТР; var Z : MATР);
получаем следующие свойства:
УМН(A,B,C)
УМН(A,B,A)
УМН(A,B,B)
Next:6.1.5
Вычисление единственного значения-функции
Up:6.1
Подпрограммы: процедуры и функции
Previous:6.1.3
Изменение действия-выходные параметры