Процедурные типы. Параметры-функции и параметры-процедуры.
Стандартные процедуры (функции) Турбо Паскаля не могут передаваться рассмотренным способом.
В программе могут быть объявлены переменные процедурных типов, например, так:
var p1: Proc1; f1, f2: Func2; р: array [1..N] of Proc1;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы, например:
type Proc = Procedure (n: word; var a: Byte); var ProcVar: Proc; x, у: Byte; Procedure Procl(x: word; var y: Byte); far; begin if x > 255 then у: = x mod 255 else у: = Byte(x) end; begin {Главная программа} ProcVar: = Proc1; for x: = 150 to' 180 do begin ProcVar (x + 100, y); Write (y:8) end end.
Разумеется, такого рода присваивания допустимы и для параметров-функций, например:
type FuncType = Function (i: Integer): Integer; var VarFunc: FuncType; i: Integer; Function MyFunc (count: Integer): Integer; far; begin ……. end; {MyFunc} begin {Основная программа} ……. i: = MyFunc(1); {Обычное использование результата функции} ……. VarFunc: = MyFunc; {Присваивание переменной процедурного типа имени функции MyFunc} ……. end.
Отметим, что присваивание:
VarFunc: = MyFunc(1);
Будет недопустимым, так как слева и справа от знака присваивания используются несовместимые типы: слева – процедурный тип, а справа – INTEGER; имя функции со списком фактических параметров MyFunc(1) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции.
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения, параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).