Процедурные типы. Параметры-функции и параметры-процедуры.
Стандартные процедуры (функции) Турбо Паскаля не могут передаваться рассмотренным способом.
В программе могут быть объявлены переменные процедурных типов, например, так:
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) трактуется Турбо Паскалем как обращение к значению функции, в то время как имя функции без списка параметров рассматривается как имя функции.
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре (функции) любые типы параметров: параметры-значения, параметры-переменные, параметры-константы (в стандартном Паскале только параметры-значения).
