top of page

Параметры-переменные

Если перед именем формального параметра стоит ключевое слово 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.

Под формальные и фактические параметры-значения транслятор отводит разные области памяти. Поэтому результат выполнения процедуры может быть передан только через параметр-переменную.

 

  1. var

  2.     a, b: integer;

  3.  

  4. procedure h(x: integer; var y: integer);

  5.     begin

  6.         x :=x + 1;

  7.         y :=y + 1;

  8.         writeln(x, y)

  9.     end;

  10.  

  11. begin

  12.     a :=0;

  13.     b :=0;

  14.     h(a, b);

  15.     writeln(a, b);

  16.  

  17. readln

  18. 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. В заголовке самой процедуры параметры опускаются.

 

Пример.

 

  1. procedure q(x: t1): forward;

  2.  

  3. procedure p(x: y);

  4.     begin

  5.         q(a)

  6.     end;

  7.  

  8. procedure q;

  9.     begin

  10.         p(b)

  11.     end;

bottom of page