Параметры процедурного типа
Поскольку процедурные типы допускается использовать в любом контексте, то можно описывать процедуры или функции, которые воспринимают процедуры и функции в качестве параметров. В следую- щем примере показывается использование параметров процедурного типа для вывода трех таблиц различных арифметических функций:
program Tables;
type Func = function(X,Y: integer): integer;
function Add(X,Y: integer): integer; far; begin Add := X + Y; end;
function Multiply(X,Y: integer): integer; far; begin Multiply := X*Y; end;
function Funny(X,Y: integer): integer; far; begin Funny := (X+Y) * (X-Y); end;
procedure PrintTable(W,H: integer; Operation: Func); var X,Y : integer; begin for Y := 1 to H do begin for X := 1 to W do Write(Operation(X,Y):5); Writeln; end; Writeln; end;
begin PrintTable(10,10,Add); PrintTable(10,10,Multiply); PrintTable(10,10,Funny); end.
При работе программа Table выводит три таблицы. Вторая из них выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
Параметры процедурного типа особенно полезны в том случае, когда над множеством процедур или функций нужно выполнить ка- кие-то общие действия. В данном случае процедуры PrintTable представляет собой общее действие, выполняемое над функциями Add, Multiply и Funny.
Если процедура или функция должны передаваться в качестве параметра, они должны удовлетворять тем же правилам совместимости типа, что и при присваивании. То есть, такие процедуры или функ- ции должны компилироваться с директивой far, они не могут быть встроенными функциями, не могут быть вложенными и не могут описы- ваться с атрибутами inline или interrupt.