| 8. Процедурные типыВ Turbo Pascal процедуры и функции можно рассматривать как некоторые параметры и можно использовать переменные, принимающие значение процедуры или функции. С этой целью вводятся процедурные типы, которые указывают, какой вид подпрограммы (процедуру или функцию) можно использовать в качестве параметра и с какими параметрами должны быть эти подпрограммы. Объявление процедурного типа похоже на заголовок подпрограммы (см. п. 10): пишется слово procedure или function, за которым в круглых скобках записывается список формальных параметров; для функции после списка формальных параметров через двоеточие указывается тип функции. В отличие от заголовка подпрограммы здесь не указывается имя подпрограммы. Пример. typeProc1 = procedure;	             {процедура без параметров}
 Proc2 = procedure(var X,Y: Integer);
 {процедура с двумя параметрами-переменными целого типа}
 Func1 = function(X: Real): Real;
 {функция вещественного типа с одним параметром-значением}
 Далее можно ввести переменные этих типов: var	Р1 :  Proc1;
 Р2 :  Proc2;
 F1 :  Func1;
 После этого процедурным переменным можно присваивать значения конкретных процедур и функций. Как и во всех других случаях, процедурная переменная и подпрограмма должны быть совместимы для присваивания (т. е. должны иметь одинаковое число формальных параметров, совпадающих по типам; функции, кроме того, должны иметь идентичный тип).	| Существует ряд правил использования подпрограмм в качестве процедурной переменной:
 они должны компилироваться с ключом компилятора {$F+} или иметь директиву far для получения полного адреса подпрограмм;они не должны быть стандартными процедурами и функциями;они не должны объявляться внутри других процедур и функций;они не должны быть типа inline или interrupt (пп. 10.5.5 и 10.5.6).
 Пример. {$F+}procedure  Swap (var A,   B:   Byte);
 var
 Temp:   Byte;
 begin
 Temp  :=A;   A   :=B;   В   := Temp
 end;
 function Tan(Angle:   Real):   Real;
 begin
 Tan:=Sin(Angle) / Cos(Angle)
 {проверка, что Cos(Angle)<>0, осуществляется в основной программе}
 end;
 {$F-}
 В этом случае процедурным переменным, введенным ранее, можно присвоить значения: Р2   := Swap; Fl   := Tan;
 а вызовы P2(I,J) и F1(X) эквивалентны соответственно Swap(I,J) и Таn(Х). Так же как и указатель, процедурная переменная занимает 4 байта памяти, в которых помещается полный адрес подпрограммы (поэтому подпрограммы необходимо компилировать с ключом {$F+}). Процедурные переменные можно использовать так же, как и переменные других типов: в выражениях (если эта переменная - функция), в виде оператора (если эта переменная - процедура), как компонента другой более сложной переменной, как передаваемый в подпрограмму параметр. Идея единства данных и подпрограмм получила дальнейшее развитие в объектно-ориентированном программировании - см. п. 14. 
 
 |