Процедурні типи - це нововведення фірми Borland (у стандартному Паскалі таких типів немає). Основне призначення цих типів - дати програмісту гнучкі засоби передачі функцій і процедур в якості фактичних параметрів звернення до інших процедур і функцій.
Prod = Procedure (a, b, c: Real; var d: Real);
Proc2 = Procedure (var a, b);
Func1 = Function: String;
Func2 = Function (var s: String): Real;
Як видно з наведених прикладів, існує два процедурних типу: тип-процедура і тип-функція.
Приклад 8.3 ілюструє механізм передачі процедур в якості фактичних параметрів виклику. Програма виводить на екран таблицю двох функцій:
sin1 (х) = (sin (x) + 1) * ехр (х)
cos1 (x) = (cos (x) + 1) * exp (-x).
Обчислення і друк значень цих функцій реалізуються в процедурі PRINTFUNC, якої в якості параметрів передаються номер позиції N на екрані, куди буде виводитися черговий результат (за допомогою цього параметра реалізується висновок в дві колонки), і ім'я потрібної функції.
Func = Function (x: Real). Real;
Procedure PrintFunc (XPos: Byte; F: Func);
PrintFunc (40, cos1)
Зверніть увагу: для встановлення правильних зв'язків функцій SIN1 і COS1 з процедурою PRINTFUNC вони повинні компілюватися з розрахунком на далеку модель пам'яті. Ось чому в програму вставлені стандартні директиви FAR відразу за заголовками функцій. У такому режимі повинні компілюватися будь-які процедури (функції), які будуть передаватися в якості фактичних параметрів виклику.
Стандартні процедури (функції) Турбо Паскаля не можуть передаватися розглянутим способом.
У програмі можуть бути оголошені змінні процедурних типів, наприклад, так:
р. array [1..N] of Proc1;
Змінним процедурних типів допускається привласнювати як значення імена відповідних підпрограм. Після такого присвоювання ім'я змінної стає синонімом імені підпрограми, наприклад:
Proc = Procedure (n: word; var a: Byte);
ProcVar: Proc; x, у. Byte;
Procedure Procl (x: word; var y: Byte); far;
if x> 255 then