Команды подстыковки объектных файлов в программу на Турбо Паскале задаются директивами компилятора {$L ИмяФайла.OBJ}, установленными в подходящих местах программы. А те процедуры и функции, которые реализованы в этих файлах, должны быть объявлены своими заголовками и специальным словом EXTERNAL, например:
{$L memlib.obj} { включение объектного кода }
procedure MemProc1; external;
PROCEDURE MemProc2( X,Y : Byte ); EXTERNAL;
FUNCTION MemFunc1( X :Byte; VAR Y :Byte ): Word; EXTERNAL;
Подключенные таким образом внешние функции или процедуры в дальнейшем ничем не отличаются от написанных в тексте. Обычно директиву включения OBJ-файла и объявления внешних подпрограмм удобно размещать рядом. Порядок следования директивы $L и описаний заголовков может быть произвольным.
6.9.4. Процедуры и функции как параметры
Отличительной особенностью Турбо Паскаля является разрешение передавать в процедуры и функции имена других подпрограмм, оформляя их как параметры. И точно так же, как передавалось значение, может передаваться некая функция его обработки. Особенно важным это становится при программной реализации алгоритмов вычислительной математики (хотя можно назвать и ряд других областей). Например, становится возможным написать процедуру интегрирования любой функции вида f(t) по следующей
- 114 -
схеме (рис. 6.10). Неочевидным здесь может показаться только введение функционального типа и то, как он определяется.
PROCEDURE Integrate LowerLimit, UpperLimit : Real;
VAR
> Result : Real;
> Funct : Функциональный тип);
>VAR Описание локальных переменных процедуры
> t : Real;
BEGIN
> Численное интегрирование по t от LowerLimit до
> Upper limit функции Funct, причем для получения
> значения функции при заданном аргументе t достаточно
> сделать вызов Funct(t).
> Результат интегрирования должен быть возвращен через
> параметр-переменную Result.
END;
Рис. 6.10
Функциональный или процедурный тип (в зависимости от того что описывается) — отнюдь не тип возвращаемого значения, а тип заголовка подпрограммы в целом. Так, на рис. 6.10 параметр Func есть одноместная функция вида f(t), возвращающая вещественное значение. Класс таких функций может быть описан типом
| TYPE
RealFunctionType = function ( t : Real ) : Real;
В этом описании имя подпрограммы не ставится — оно здесь не играет роли. Но обязательно перечисляются типы параметров и, если тип описывает функцию, тип результата. Идентификаторы параметров могут быть выбраны произвольно. Основная смысловая нагрузка падает на их типы и порядок следования. Тип, к которому могла бы принадлежать процедура Integral (см. рис. 6.10), должен был бы выглядеть примерно так: