Выбрать главу

TYPE Блок объявления библиотечных типов

VAR Блок объявления библиотечных переменных

Заголовки библиотечных процедур и (или) функций

IMPLEMENTATION ← начало раздела реализации

USES { используемые при реализации модули:}

Имя_Модуля101, Имя_Модуля202, ... ;

CONST Блок объявления внутренних констант

TYPE Блок объявления внутренних типов

VAR Блок объявления внутренних переменных

LABEL Блок описания меток блока инициализации

BEGIN

Блок инициализации модуля

END.

Рис. 6.17

Модуль разделяется на четыре части:

— заголовок модуля (UNIT имя);

— раздел объявлений или интерфейс (INTERFACE);

— раздел реализации (IMPLEMENTATION);

— раздел инициализации (между BEGIN и END).

Все блоки, составляющие эти разделы (см. рис. 6.17), являются необязательными, и могут отсутствовать (как могут и появляться неоднократно). Обязательные слова, входящие в модуль, продемонстрированы на рис. 6.18, где показан пустой модуль.

- 126 -

UNIT Пустой;

INTERFACE

IMPLEMENTATION

END.

Рис. 6.18

Обращаем внимание на отсутствие точек с запятой после ключевых слов. Если не вводится раздел инициализации, то начинающее его слово BEGIN не ставится.

Заголовок модуля вводит имя, по которому модуль будет подключаться к другим программам. Имя должно быть уникальным (не иметь повторов внутри модуля) и соответствовать имени файла (с расширением .PAS) , хранящего исходный текст модуля (а после компиляции на диск имени файла с расширением .TPU).

Имя модуля как идентификатор имеет до 64 значащих символов. Но имя файла на диске не может превышать длину в восемь символов! Тем не менее имя модуля не обязательно ограничивать восемью символами. Пусть их будет больше, но при этом первые восемь должны совпадать с именем файла. А в основной программе в директиве USES должно стоять полное имя, как и в заголовке самого модуля.

Раздел объявлений, начинающийся словом INTERFACE, содержит описания типов, констант и переменных, которые будут привноситься в программу при подключении модуля. В нем же описываются заголовки процедур и функций, составляющих собственно библиотеку подпрограмм. В разделе обявлений указываются только заголовки, потому что информация о содержимом подпрограмм модуля не нужна на этапе компиляции, а используется только при компоновке программы. Исключение составляют процедуры с директивой inline (см. разд. 14.7.2). Они могут целиком задаваться в разделе объявлений. Недопустимы заголовки с директивами interrupt (см. разд. 16.6) и forward.

Если при объявлении типов, данных или подпрограмм используются константы и типы, введенные в других модулях (библиотеках), то эти модули должны быть перечислены в директиве USES сразу после ключевого слова INTERFACE. В модулях директива USES может появляться дважды. Второй раз — в разделе реализации. Рекомендуется указывать в разделе объявлений только те модули, которые необходимы. Прочие лучше подсоединить в другом месте.

- 127 -

Раздел реализации состоит, как правило, из тел процедур и функций, объявленных в разделе объявлений. Как и в случае с опережающим описанием (forward), тела подпрограмм могут иметь сокращенный заголовок: без указания параметров. Но если заголовок дан в полном виде, то он должен в точности соответствовать данному ранее объявлению.

В разделе реализации могут быть введены свои типы, константы и переменные. Они будут считаться глобальными по отношению к подпрограммам этого раздела, а также операторам раздела инициализации (если последний имеется). В программе, подключающей модуль, объявленные при реализации данные и типы недоступны.

Если в телах процедур или при заданиях типов либо переменных необходимо что-либо, объявленное в других модулях, и эти модули не попали в директиву USES раздела объявлений, то их надо перечислить в директиве USES сразу после слова IMPLEMENTATION.

В разделе реализации могут описываться подпрограммы, участвующие в работе объявленных процедур и функций, но сами не являющиеся объявленными.

Раздел инициализации завершает текст модуля. Если он отсутствует, то просто ставится слово END с точкой после конца последнего тела подпрограммы раздела реализации. В противном случае ставится слово BEGIN, и далее программируются действия, которые будут произведены перед выполнением основной программы (работа скомпилированной программы всегда начинается с выполнения блоков инициализации используемых ею модулей, и лишь потом выполняется основной блок самой программы). Обычно в разделе инициализации происходит заполнение стартовыми значениями библиотечных переменных и какие-нибудь одноразовые действия, которые должны выполниться именно в начале программы. На рис. 6.19 приводится пример модуля с инициализацией.

6.11. Особенности работы с модулями

Порядок подключения модулей в программу, вообще говоря, существенен. Подключение модулей происходит по ходу их перечисления: слева направо. В этом же порядке срабатывают блоки инициализации. (Инициализация происходит только при работе программы. При подключении модуля к модулю инициализации не будет.) Некоторые коммерческие пакеты библиотек на Турбо Паскале, реализованные в виде модулей, требуют соблюдения определенного порядка их перечисления при подключении. Первыми обыч-

- 128 -

| UNIT Colors; { Модуль, вводящий цветовые константы }

| INTERFACE

| TYPE

| ColorType = Array[0..15] of Byte;{определено 16 цветов}

| CONST

| Black : Byte = 0; Blue : Byte = 1;

| Green : Byte = 2; Cyan : Byte = 3;

| Red : Byte = 4; Magenta : Byte = 5;

| Brown : Byte = 6; LightGray : Byte = 7;

| DarkGray : Byte = 8; LightBlue : Byte = 9;

| LightGreen : Byte = 10; LightCyan : Byte = 11;

| LightRed : Byte = 12; LightMagenta : Byte = 13;

| Yellow : Byte = 14; White : Byte = 15;

| VAR

| CurrColors: ColorType absolute Black; {текущие значения}

| PROCEDURE SetMonoColors; (настройка цветов на режим MONO}

| PROCEDURE SetColorColors; (настройка цветов в режим ЦВЕТ}

| IMPLEMENTATION

| CONST ( значения констант для режимов: }

| ColorColors : ColorType =

| (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);

| MonoColors : ColorType =

| (0,1,7,7,7,7,7,7,7,7, 7, 7, 7, 7,15,15);

| PROCEDURE SetMonoColors;

| BEGIN

| CurrColors := MonoColors;

| END;

| PROCEDURE SetColorColors;

| BEGIN

| CurrColors := ColorColors;

| END;

| VAR

| ch : Char;

| BEGIN

| { Запрос и настройка на соответствующий режим: }

| Write('Тип Вашего монитора(Ц-цветной, М-монохромный)?');

| ReadLn( ch ):

| if ch in ['M', 'm','М', 'м']

| then

| SetMonoColors;

| END.

| Примечание: для того чтобы модуль корректно вводил константы надо, чтобы в директиве USES программы он стоял после модуля CRT.

полную версию книги