21. Модули. Создание и использование модулей

Наряду со стандартными модулями Turbo Pascal^ вы можете создавать и ис­пользовать в программах свои собственные модули. Модуль имеет следующую структуру:

UNIT имя модуля;

INTERFACE

интефейсная часть

IMPLEMENTATION

внутренняя часть BEGIN

исполняемая часть

END.

Имя модуля - идентификатор длиной не более 8 символов, причем файл, со­держащий модуль, должен иметь такое же имя. После ключевого слова INTERFACE располагаются описания типов, констант, переменных, функций и процедур, которые будут доступны пользователю этого модуля. Ключевое слово IMPLEMENTATION открывает внутреннюю часть модуля. В ней должны быть записаны все процедуры и функции, заголовки которых есть в интерфейсной части. Кроме того, во внутренней части можно описывать и другие переменные, константы, типы, функции и процедуры, но они уже будут недоступны другим программам. Исполняемая часть модуля может содержать обычные операторы, которые выполняются до начала выполнения программы, использующей этот модуль. Но как правило исполняемая часть пустая (а можно вообще не записы­вать слово BEGIN). Любой модуль может использовать другие модули как в ин­терфейсной, так и во внутренней частях, но следует избегать перекрестных ссы­лок, когда модуль А использует модуль Б, а Б использует А. Запишем небольшой модуль : пусть нам предстоит решать какие-нибудь задачи линейной алгебры, и мы хотим некоторые часто используемые алгоритмы объединить в модуль.

UNIT Algebra; INTERFACE

CONST Nmax=10;

{ полагаем,что наибольший размер матриц и векторов - 8} TYPE Vector = ARRAY[1..Nmax] OF Real; {тип для векторов} TYPE Matrix = ARRAY[1..Nmax] OF Vector; {тип для матриц} FUNCTION Scalar(n:Byte; a,b:Vector):Real; {скалярное произведение векторов длиной n}

PROCEDURE SumMatrix(n,m:Byte; A,B:Matrix; VAR C:Matrix);{сумма матриц размера nxm}

PROCEDURE MultMatrix(nA,mA,nB,mB:Byte; A,B:Matrix; VAR C:Matrix);

{ произведение матриц размера nA x mA

и nB x mB}

IMPLEMENTATION USES Crt;

VAR ij,k : Byte;

{это ВНУТРЕННЯЯ процедура} PROCEDURE SumVector(n:Byte; a,b:Vector; VAR c:Vector);

BEGIN FOR i:=1 TO n DO c[i]:=a[i]+b[i]; END;

{ это ВНУТРЕННЯЯ процедура} PROCEDURE Peeek; BEGIN Sound(400); Delay(100); NoSound; END; FUNCTION Scalar; VAR S : Real;

BEGIN S:=0; FOR i:=1 TO n DO S:=S+a[i]*b[i]; Scalar:=S; END;

PROCEDURE SumMatrix;

BEGIN FOR i:=1 TO n DO SumVector(m,A[i],B[i],C[i]); END;

PROCEDURE MultMatrix;

BEGIN IF mA<>nB THEN BEGIN Peeek; Exit; END;

FOR i:=1 TO nA DO FOR j:=1 TO mB DO BEGIN

C[ij]:=0; FOR k:=1 TO mA DO C[ij]:=C[ij]+A[i,k]*B[kj];

END;

END;

BEGIN { пустая исполняемая часть} END.

Если откомпилировать этот модуль, то будет создан файл с именем ALGEBRA.TPU, который впоследствии и будут использовать наши программы (расширение TPU означает Turbo Pascal Unit). Например:

USES Algebra;

VAR W,Q,Z : Matrix;

BEGIN MultMatrix(3,4,4,6,W,Q,Z); END.

Можно компилировать одновременно и программу, и все используемые в ней модули командой F9 ("Make" в подменю "Compile"). При этом будут созданы и все TPU-файлы и EXE-файл. Не забудьте, что имя файла, в котором мы храним текст модуля Algebra, должно быть обязательно "ALGEBRA.PAS" !