Тема 9. Модули. Структура модулей. Заголовок модуля и связь модулей друг с другом. Интерфейсная часть. Исполняемая часть. Инициирующая часть. Компиляция модулей. Доступ к объявленным в модуле объектам. Примеры использования модулей.
Модули – это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции) а, возможно, некоторые исполняемые операторы инициирующей части.
Модуль имеет следующую структуру:
UNIT <имя>;
INTERFACE
<интерфейсная часть>
IMPLEMENTATION
<исполняемая часть>
BEGIN
<инициирующая часть>
END.
Здесь UNIT- зарезервированное слово (единица); начинает заголовок модуля; <имя> - имя модуля;
INTERFACE – зарезервированное слово (интерфейс); начинает интерфейсную часть модуля;
IMPLEMENTATION – зарезервированное слово (выполнение); начинает исполняемую часть;
BEGIN – зарезервированное слово; начинает инициирующую часть модуля; конструкция BEGIN <инициирующая часть> необязательная;
END – зарезервированное слово – признак конца модуля.
Таким образом, модуль состоит из заголовка и трех составных частей, любая из которых сможет быть пустой;
В интерфейсной части сконцентрированы описания глобальных типов, констант и переменных, а также приводятся заголовки глобальных процедур и функций. Появление объектов в интерфейсной части делает их доступными для других модулей и основной программы. Тела процедур и функций располагаются в исполняемой части модуля, которая может быть скрыта от пользователя.
Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модульного программирования. Важная особенность модулей заключается в том, что компилятор Турбо Паскаля размещает их программный код в отдельном сегменте памяти. Максимальная длина сегмента не может превышать 64 байта, однако количество одновременно используемых модулей ограничивается лишь доступной памятью, что дает возможность создать весьма крупные программы.
Заголовок модуля и связь модулей друг с другом
Заголовок модуля состоит из зарезервированного слова UNIT и следующего за ним имени модуля:
UNIT <имя модуля>;
Имя модуля должно совпадать с именем дискового файла, в котором размещается исходный текст модуля. Например:
UNIT METOD; Исходный текст соответствующего модуля должен размещаться в дисковом файле METOD.PAS. Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением:
USES <сп. модулей>
Здесь USES – зарезервированное слово (используется);
<сп. модулей> - список модулей, которыми устанавливается связь; элементами списка являются имена модулей, отделяемые друг от друга запятыми, например:
Uses CRT, GRAPH, METOD;
Если используется объявления USES…, оно должно открывать раздел описаний основной программы. Модули могут использовать другие модули. Предложение USES в модулях может следовать либо сразу за зарезервированным словом INTERFACE, либо сразу за словом IMPLEMENTATION, либо, наконец, и там, и там (т.е. допускаются два предложения USES)
Интерфейсная часть
Интерфейсная часть открывается зарезервированным словом INTERFACE. В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и или другим модулем.
При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, Например:
UNIT Cmplx;
INTERFACE
Type
Complex = record
re, im: real
end;
Procedure AddC (x, y, : complex; VAR Z : complex);
Procedure MulC (x, y, : complex; VAR Z : complex);
Если теперь в основной программе написать предложение
Uses Cmplx;
то в программе станут доступными тип Complex и две процедуры AddC и MulC из модуля Cmplx.
Отметим, что объявление, подпрограмм в интерфейсной части автоматически сопровождается их компиляцией с использованием дальней модели памяти. Таким образом, обеспечивается доступ к подпрограммам из основной программы и других модулей.
Следует учесть, что все константы и переменные, объявленные в интерфейсной части модуля, равно как и глобальные константы и переменные основной программы, помещаются компилятором в общий сегмент данных.
Исполняемая часть
Исполняемая часть начинается словом IMPLEMENTATION и содержит описания подпрограмм, объявленных в интерфейсной части. В ней могут объявляться локальные для модуля объекты – вспомогательные типы, константы, переменные и блоки, а также метки, если они используются в инициирующей части.
При описании подпрограммы, объявленной в интерфейсной части модуля, заголовок подпрограммы можно опускать список формальных параметров (и тип результата для функции), так как они уже описаны в интерфейсной части. Но если заголовок подпрограммы приводится в полном виде, т.е. со списком формальных параметров и объявлением результата, он должен совпадать с заголовком, объявленным в интерфейсной части, Например:
UNIT Cmplx;
INTERFACE
Type complex = record re, im : real end;
Procedure AddC (x, y : complex; VAR Z : complex);
IMPLEMENTATION
PROCEDURE AddC;
begin
z . re := x. re + y. re;
z . im := x. im + y. im
end;
end.
Локальные переменные и константы, а также все программные коды, порожденные при компиляции модуля, помещаются в общий сегмент памяти.
Инициирующая часть
В инициирующей части размещаются исполняемые операторы, содержащие некоторый фрагмент программы. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Например, в них могут инициироваться переменные, открываться нужные файлы, устанавливаться связи с другими ПК по коммуникационным каналам и т.п.:
UNIT FILETEXT;
INTERFACE
PROCEDNRE PRINT (s : string);
IMPLEMENTATION
VAR
f : text
const
name = ‘output. txt’;
Procedure Print;
begin
Write (t, s)
end;
{начало инициирующей части}
begin
assign (f, name);
rewrite (f);
{конец инициирующей части}
end.
Необходимо отметить, что инициирующую часть можно опустить, чем оформлять в модуле пустую инициирующую часть.