Рекурсия и опережающее описание. Расширенный синтаксис вызова функций.
Рекурсивный вызов может быть косвенным. В этом случае подпрограмма обращается к себе опосредованно, путем вызова другой подпрограммы, в которой содержится обращение к первой, например:
Procedure A (i: Byte); begin ……. В (i); ……. end; Procedure В (j: Byte); ……. begin ……. A(j); ……. end;
Если строго следовать правилу, согласно которому каждый идентификатор перед употреблением должен быть описан, то такую программную конструкцию использовать нельзя. Для того, чтобы такого рода вызовы стали возможны, вводится опережающее описание:
Procedure В(j: Byte); forward; Procedure A(i: Byte); begin ……. В (i); ……. end; Procedure В; begin ……. A(j); ……. end;
Как видим, опережающее описание заключается в том, что объявляется лишь заголовок процедуры В, а ее тело заменяется стандартной директивой FORWARD. Теперь в процедуре А можно использовать обращение к процедуре В – ведь она уже описана, точнее, известны ее формальные параметры, и компилятор может правильным образом организовать ее вызов. Обратите внимание: тело процедуры В начинается заголовком, в котором уже не указываются описанные ранее формальные параметры.
Расширенный синтаксис вызова функций
В Турбо Паскале есть возможность вызывать функцию и не использовать то значение, которое она возвращает. Иными словами, вызов функции может внешне выглядеть как вызов процедуры, например:
{$Х+} {Включаем расширенный синтаксис} Function My.Func (var x: Integer): Integer; begin if x<0 then x: = 0 else MyFunc: = x+10 end; {MyFunc} var i: Integer; begin {main} i: = 1; i: = 2*MyFunc(i) – 100; {Стандартный вызов функции} MyFunc (i) {Расширенный синтаксис вызова} end. {main}
Расширенный синтаксис делает использование функций таким же свободным, как, например, их использование в языке Си, и придает Турбо Паскалю дополнительную гибкость. С помощью расширенного синтаксиса нельзя вызывать стандартные функции. Компиляция с учетом расширенного синтаксиса включается активным состоянием опции EXTENDED SYNTAX диалогового окна OPTIONS/COMPILER (см. прил.1) или глобальной директивой компилятора {$Х+}.