UNIT <имя>; {заголовок модуля}
INTERFACE {Интерфейсная часть}
{uses <список_вспомогательных_модулей>;}
{Объявления глобальных (доступных)
¨ типов,
¨ констант,
¨ переменных;}
{Заголовки доступных процедур и/или функций}
IMPLEMENTATION {Исполняемая часть/ реализации}
{uses <список_вспомогательных_модулей>;}
{ Объявления локальных
¨ типов,
¨ констант,
¨ переменных;}
{Описания процедур и/или функций, описанных в интерфейсной части;}
{Объявления_и_описания_внутренних (локальных)_процедур и/или функций }
[ BEGIN
{ Инициирующая часть}]
END.
Таким образом, модуль состоит из заголовка и трех частей, любая из которых может быть пустой:
¨ Интерфейсная часть (INTERFACE)
¨ Исполняемая часть ( IMPLEMENTATION)
¨ Инициирующая часть (между BEGINEND.)
Все блоки, составляющие разделы являются не обязательными и могут отсутствовать. Пример обязательных слов, входящих в модуль продемонстрирован на примере пустого модуля.
UNIT Pustoi;
INTERFACE
IMPLEMENTATION
END.
1. Имя модуля.
Имя модуля должно соответствовать имени файла, хранящего исходный текст модуля, а после компиляции на диск – имени файла с расширением.TPU.
|
|
UNIT GLOBAL
GLOBAL.PAS GLOBAL.TPU
Следует помнить, что имя файла на диске ограничивается 8-ю символами.
2. INTERFACE {Интерфейсная часть}
Здесь содержатся объявления всех глобальных (библиотечных) объектов, которые должны быть доступны основной программе или другим модулям.
Unit Globals;
INTERFACE
Const
Len=100;
Type
Tvector=array[1..len] of integer;
Function MAX(n:len; var mas:tvector):integer;
IMPLEMENTATION
…………………
END.
Если в основной программе написать uses globals, то константа Len, тип TVector, функция MAX будут доступны в основной программе.
3. IMPLEMENTATION {Исполняемая часть}
Содержит тела процедур и функций, объявленных в интерфейсной части. Ранее объявленные процедуры и функции должны быть описаны в той же последовательности, в какой появляются заголовки в интерфейсной части.
Тела подпрограмм могут иметь сокращенный заголовок (без указания параметров).
В этой части могут быть объявлены локальные для модуля объекты: вспомогательные
¨ типы,
¨ константы,
¨ переменные,
которые используются в инициирующей части. А также описаны п/п, используемые в инициирующей части.
4. Инициирующая часть (между BEGIN и END.)
Завершает модуль. Может отсутствовать, тогда просто END. В противном случае ставится BEGIN и далее программируются действия, которые должны быть произведены перед выполнением основной программы: открытие нужных файлов, инициация переменных и т.д.
Unit FileText;
INTERFACE
Procedure Write_(s:string);
IMPLEMENTATION
Var
F:text;
Const
Name='output.txt';
Procedure Write_;
begin
Writeln(f,s);
end;
BEGIN
Assign(f,name);
Rewrite(f)
END.
Если сразу несколько модулей содержат секции инициализации, то порядок выполнения этих секций будет следующим:
|
|
- Если модуль А подключает модуль В (не важно, в какой именно секции), то секция инициализации модуля В будет выполнена раньше, чем секция инициализации, содержащаяся в модуле А.
- Если два модуля В и С подключаются на одном уровне (считаются равноправными), то их секции инициализации будут выполнены в том порядке, в каком имена этих модулей указаны в разделе uses.
Запрещается явное или косвенное обращение модуля к самому себе (в интерфейсной части).
Unit C; Unit A; Unit B;
INTERFACE INTERFACE INTERFACE
Uses c; Uses b; Uses a;
---- ---- ----
END. END. END.
В отличие от секции внешних связей, секции реализации из различных модулей могут использовать друг друга рекурсивно. Иными словами, совершенно законной будет запись, например, такого вида:
unit mod_1;
interface
...
implementation
uses mod_2;
...
unit mod_2;
interface
...
implementation
uses mod_1;
...