Если тексты процедур и функций размещены непосредственно в программе (как это было описано в предыдущем разделе), то их можно назвать внутренними. Когда возникает необходимость применить некоторые из этих процедур и/или функций в другой программе, придется переписать их туда. Хотя сделать это совсем не сложно, но при большом их количестве увеличение текста программы может оказаться чрезмерным. В Турбо Паскале используется более изящное решение этой проблемы – процедуры и функции можно помещать в модули, которые потом допустимо присоединять к любым программам (при этом совсем необязательно иметь в наличии исходный текст).
Процедуры и функции, описанные в модуле, являются внешними по отношению к программе, которая их использует.
В Турбо Паскале существует 2 вида модулей:
1) модули пользователей;
2) стандартные модули.
Модули пользователей
Структура модуля (стандартного или написанного пользователем) приведена на рис. 2.11.
Модуль должен начинаться с заголовка, включающего служебное слово Unit и имя_модуля.
Пример.
Unit MyModul; или
Unit Sort;
Имя файла, содержащего модуль, и имя модуля должны быть одинаковыми!
Применительно к приведенному примеру это означает, что модуль MyModulдолжен храниться в файле MyModul.pas, а модуль Sort– в файле Sort.pas.
Интерфейсная секция — общедоступная часть, "видимая" из любой программы (модуля). В ней описываются так называемые глобальные данные (константы, типы, переменные), используемые в модуле и доступные программе (или другим модулям, к которым присоединен данный). Здесь же содержатся заголовки (но не тексты!) процедур и функций, помещенных в модуль. Любая программа имеет доступ к этим объектам, как если бы они были описаны в ней.
Секция реализации содержит тела процедур и функций, описанных в интерфейсной секции. Здесь же описываются константы, переменные, процедуры и функции, являющиеся локальными, т.е. недоступными вне этого модуля.
После нее может быть секция инициализации. Она не имеет заголовка и может содержать (или не содержать) некоторую последовательность операторов, выполняющуюся при использовании модуля.
Итак, последняя часть модуля всегда имеет следующий вид:
Begin
Операторы, выполняющиеся при инициализации модуля, которые могут отсутствовать.
End.
Модуль компилируется отдельно. Получается файл с расширением tpu, например, MyModul.tpu или Sort.tpu. Откомпилированный модуль компилятором должен быть помещен на диск. Если это не делается по умолчанию, то в меню Compile должно быть устанавлено Destination - disk (а не Memory).
Чтобы программа могла работать с какими-либо модулями, сразу после ее заголовка должен быть записан оператор использования, определяемый служебным словом Uses. После этого слова через запятую перечисляются имена всех модулей, непосредственно используемых программой, а также модулей, используемых первыми.
Пример. Program Test;
Uses
MyModul, Sort, Dos;
Const
Пример 1. Напишем модуль, содержащий процедуру сортировки массива вещественных чисел, и функцию, определяющую сумму его элементов.
Unit Sort;
Interface { интерфейсная секция }
Const { Глобальная константа и тип }
Nmax=200;
Type
mas = array[1..Nmax] of real;
Procedure SortY(Var Y : mas; m : integer);
Function SumMas (Y : mas; m : integer): real;
Implementation { секция реализации }
Procedure SortY; { можно только имя }
Var
i,k : integer;
a : real;
Begin
for k := 1 to m-1 do
for i := 1 to m-k do
if Y[i]>Y[i+1]then
Begin
a := Y[i];
Y[i] := Y[i+1];
Y[i+1] := a;
end;
end; { SortY }
Function SumMas; { можно только имя }
{Нахождение суммы элементов массива вещественных чисел}
Var
I : Integer;
S : Real; { Вспомогательная переменная - сумма}
Begin
S := 0;
For i := 1 to k Do
S:=S + X[i];
SumMas:=S;
End; { SumMas }
Begin
{ секция инициализации не содержит операторов }
End.
Основная программа, которая использует этот модуль, может быть такой.
Program Main;
Uses
Sort; {пользовательский модуль}
Var
X:mas; { mas - глобальный тип, описанный в модуле sort}