- •Для студентов, обучающихся по направлению 090303 «Информационная безопасность автоматизированных систем»
- •Принципы модульного программирования
- •2. Назначение модулей
- •3. Структура модулей
- •3.1. Заголовок модуля
- •3.2 Интерфейс модуля
- •3.3 Исполнительная часть модуля
- •3.4 Секция инициализации
- •4. Создание модуля
- •5. Компиляция модуля
- •6. Контрольный пример
- •7. Модули и принцип сокрытия информации
- •Объявленные здесь идентификаторы Len и t_mas могут исполнять роль глобальных величин для всех модулей, где в предложении uses стоит имя модуля Global.
- •Задания
- •Пояснения к заданию
- •Советы по реализации модулей
- •9. Контрольные вопросы
- •10. Библиографический список
- •Корректура составителей
- •394000 Воронеж, пр. Революции, 193
3. Структура модулей
Модуль состоит из следующих частей:
заголовок модуля;
интерфейс модуля;
исполнительная часть модуля;
секция инициализации.
Все разделы модуля, за исключением секции инициализации, являются обязательными. Обязательна также указанная последовательность разделов, что очевидно на синтаксической диаграмме (см. рис.1)
Рис. 1 Синтаксическая диаграмма структуры модуля
3.1. Заголовок модуля
Заголовок модуля состоит из ключевого слова Unit и идентификатора. Идентификатор модуля должен быть уникальным. Пример заголовка:
Unit MyMod;
Модуль должен быть помещен в файл, имя которого совпадает с именем модуля, а его расширение должно быть .РАS.
3.2 Интерфейс модуля
Через интерфейс осуществляется взаимодействие основной программы с модулем (модуля с модулем). В интерфейсе указываются константы, типы, переменные, процедуры и функции, которые могут быть использованы основной программой (модулем) при вызове этого модуля.
Интерфейс начинается словом interface и может содержать следующие разделы:
предложение uses (используемые модули);
раздел объявления констант;
раздел объявления типов;
раздел объявления переменных;
раздел объявления процедур и функций: только их полные заголовки!!
Завершается интерфейсная часть началом исполнительной части.
Предложение uses интерфейсной части модуля точно такое же, как у главной программы, а модули, перечисленные здесь, могут использоваться во всех частях модуля, а не только в интерфейсной части.
Если один модуль обращается к интерфейсной части другого, который в своей интерфейсной части обращается к третьему модулю и т. д., наконец, последний модуль использует первый модуль (так называемое циклическое использование модулей), то такая ситуация недопустима из-за того, что компилятор в этом случае не сможет установить необходимые связи .
Все разделы интерфейсной части, кроме раздела объявления используемых модулей, могут идти в любой последовательности; можно создавать несколько однотипных разделов.
В разделе объявления процедур и функций указываются лишь заголовки подпрограмм (за исключением тех подпрограмм, которые используют директиву in1inе, которая здесь допустима). Сами подпрограммы приводятся в исполнительной части модуля.
Например:
Interface
Const n=10;
Type t_m = array [1..n] of integer;
Procedure Zap_mas (var A: t_m; r:byte);
Function Sum (D : t_m): longint;
Все заявленные в этой части идентификаторы части - тип данных t_m, константа n, и имена процедуры и функции Zap_mas и Sum - доступны для использования как в самой интерфейсной так и в остальных частях модуля. Они также могут использоваться во всех других модулях и в головной программе, если имя этого модуля содержится в предложение uses этих модулей.
3.3 Исполнительная часть модуля
Исполнительная часть включает все подпрограммы модуля. Она может также включать локальные метки, константы, типы и переменные, недоступные для других программных единиц (естественно, и для интерфейса самого модуля). Начинается исполнительная часть ключевым словом imp1еmеntаtion, а завершается либо началом секции инициализации, если она есть, либо словом еnd. (с точкой).
Исполнительная часть - "внутренняя кухня" модуля, где протекают процессы, о которых не надо "знать" другим программным единицам. Она может содержать следующие разделы:
предложение uses (используемые модули);
раздел объявления меток;
раздел объявления констант;
раздел объявления типов;
раздел объявления переменных;
раздел процедур и функций
В предложении uses исполнительной части перечисляются модули, параметры которых могут употребляться в модуле всюду за исключением интерфейсной части (чаще всего так и бывает).
В исполнительной части допускается циклическое применение модулей, поэтому по мере возможности именно здесь следует объявлять модули.
Если какой-то модуль объявлен в интерфейсной части, то в исполнительной части его объявлять не следует. В предложение uses исполнительной части такое же, как и в интерфейсной части.
Все разделы исполнительной части, кроме предложения uses, могут идти в любой последовательности; можно создавать несколько, однотипных разделов.
При описании процедур и функций в исполнительной части допустимо записывать их сокращенные заголовки, как в случае директивы forward. Если же здесь записываются полные заголовки, они должны быть полностью идентичны заголовкам в интерфейсной части.
Например:
Interface
Const n=10;
Type t_m = array [1..n] of integer;
Procedure Zap_mas (var A: t_m; r:byte);
Function Sum (D : t_m): longint;
imp1еmеntаtion
uses Crt;
Procedure Zap_mas;
Var
. . .
begin
. . .
end;
Function Sum;
Var
. . .
begin
. . .
end;
В примере показано, что собственно процедуры / функции определяются в интерфейсной части. При этом их заголовок должен либо полностью повторять заявленный в интерфейсной части, либо, как в примере, содержать только имя процедуры / функции.
