Параметры-значения
Если в качестве формального параметра указана переменная, то такой параметр и есть параметр-значение. Примерами таких параметров служат параметры a, b и с в процедуре sq:
-
procedure sq((a, b, c: real; var x1, x2: real);
В этом случае фактическим параметром, соответствующим a либо b либо c, может быть любое выражение соответствующего типа, в частности, константа.
Например, обратиться к sq можно так:
-
sq((25./3 + 2) * 2, -1.5, (8.2 – 3.1) / 3, x1, x2);
Для параметров-значений машина при вызове процедур производит следующие действия: выделяет место в памяти для каждого формального параметра, вычисляет значение фактического параметра и записывает его в ячейку, соответствующую формальному параметру.
Если фактический параметр есть имя переменной, например, r, то значение этой переменной пересылается в соответствующий формальный параметр, например, a. На этом всякая связь между a и r обрывается.
Если даже фактический и формальный параметры одинаково обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это полезно знать, чтобы не допустить распространенной среди начинающих программистов ошибки – пытаться передать информацию из процедуры в вызывающую программу через параметр-значение.
Пример.
-
var
-
i: integer;
-
-
procedure p(i: integer);
-
begin
-
i :=i * 2
-
end;
-
-
begin
-
i :=2;
-
p(i);
-
writeln(' i=', i);
-
-
readln
-
end.
В программе происходит засылка числа 2 в ячейку, отведенную для переменнойi, затем идет обращение к процедуре p с фактическим параметром i=2. При этом значение 2 пересылается в другую ячейку, отведенную для формального параметраi. В этой ячейке после выполнения оператора i :=i * 2 появляется число 4. Но после возврата из процедуры на оператор writeln программа "знает" только одну переменную i, которая по-прежнему содержит число 2. Поэтому программа выведет i=2.
Если формальный параметр есть параметр-значение, то соответствующим фактическим параметром должно быть выражение того же типа, что и формальный параметр.