Язык программирования Оберон-2

Формальные параметры



Формальные параметры

Формальные параметры - идентификаторы, объявленные в списке формальных параметров процедуры. Им соответствуют фактические параметры, которые задаются при вызове процедуры. Подстановка фактических параметров вместо формальных происходит при вызове процедуры. Имеются два вида параметров: параметры-значения и параметры-переменные, обозначаемые в списке формальных параметров отсутствием или наличием ключевого слова VAR. Параметры-значения это локальные переменные, которым в качестве начального присваивается значение соответствующего фактического параметра. Параметры-переменные соответствуют фактическим параметрам, которые являются переменными, и означают эти переменные. Область действия формального параметра простирается от его объявления до конца блока процедуры, в котором он объявлен. Процедура-функция без параметров должна иметь пустой список параметров. Она должна вызываться обозначением функции, чей список фактических параметров также пуст. Тип результата процедуры не может быть ни записью, ни массивом.

ФормальныеПараметры  = "(" [СекцияФП {";" СекцияФП }] ")" [":" УточненныйИдент].
СекцияФП  = [VAR] идент {"," идент} ":" Тип.

Пусть Tf - тип формального параметра f (не открытого массива) и Ta - тип соответствующего фактического параметра a. Для параметров-переменных Ta и Tf должны быть одинаковыми типами или Tf должен быть типом запись, а Ta - расширением Tf. Для параметров-значений а должен быть совместим по присваиванию с f (см. Прил. A).
     Если Tf - открытый массив, то a должен быть совместимым массивом для f (см. Прил. A). Длина f становится равной длине a.

Примеры объявлений процедур:

PROCEDURE ReadInt (VAR x: INTEGER);
     VAR i: INTEGER; ch: CHAR;
BEGIN i := 0; Read(ch);
     WHILE ("0" <= ch) & (ch <= "9") DO
           i := 10*i + (ORD(ch)-ORD("0")); Read(ch)


     END;
     x := i
END ReadInt

PROCEDURE WriteInt (x: INTEGER); (*0 <= x <100000*)
      VAR i: INTEGER; buf: ARRAY 5 OF INTEGER;
BEGIN i := 0;
     REPEAT buf[i] := x MOD 10; x := x DIV 10; INC(i) UNTIL x = 0;
     REPEAT DEC(i); Write(CHR(buf[i] + ORD("0"))) UNTIL i = 0
END WriteInt

PROCEDURE WriteString (s: ARRAY OF CHAR);
     VAR i: INTEGER;
BEGIN i := 0;
     WHILE (i < LEN(s)) & (s[i] # 0X) DO Write(s[i]); INC(i) END
END WriteString;

PROCEDURE log2 (x: INTEGER): INTEGER;
     VAR y: INTEGER; (*предполагается x>0*)
BEGIN
     y := 0; WHILE x > 1 DO x := x DIV 2; INC(y) END;
     RETURN y
END log2


Содержание раздела