girniy.ru |
1
Модули в языке Паскаль.1. Необходимость использования модулей.Программа, написанная на языке Паскаль, состоит из главной программы и возможно нескольких модулей. Тексты главной программы и модулей размещаются в различных файлах. Выполнение всегда начинается с главной программы; операционная система осуществляет вызов того файла с расширением .ЕХЕ, который содержит код главной программы. Использование процедур и функций в программе, написанной на языке Паскаль, позволяет четко организовать и структурировать такую программу. Однако, зачастую размер главной программы может резко увеличиться за счет расположенных в ней подпрограмм. Кроме того, распределение задач между программистами и программами затруднено за счет структурного и информационного объединения подпрограмм. И наконец, малейшие изменения в тексте программы приведет к ее повторной компиляции. Решение указанных проблем привело к появлению в составе языка особых структурных единиц – модулей. Модуль - это программная единица, допускающая автономную компиляцию. Выполнение модуля может инициироваться главной программой или другими модулями. Делается это с помощью вызова процедуры или функции, входящей в состав модуля. 2.Структура модуля.В языке Паскаль в состав модуля могут входить несколько процедур и функций. Исполняемый код модуля размещается в отдельном сегменте памяти, а не в сегменте главной программы. Структура модуля напоминает структуру программы, хотя налицо и существенные различия. unit <�имя модуля Секция interface связи uses <�список_1 имен модулей>; <�внешние объявления> Секция implementation реализации uses <�список_2 имен модулей>; <�внутренние объявления> Секция Begin инициализации <�операторы> End. Модуль обязательно начинается с ключевого слова unit, за которым следует идентификатор – имя модуля. Замечание. Имя модуля обязательно должно совпадать с именем файла с расширением .pas, в котором хранится модуль. Пример. unit my_library хранится в файле my_library.pas Завершается модуль, так же, как и главная программа, ключевым словом END с точкой. Имя модуля служит для организации связи модуля с главной программой и другими модулями. Связь между модулями устанавливается с помощью оператора USES.
Секция связи начинается с оператора USES, следом за которым должны размещаться так называемые внешние объявления. Внешние объявления описывают элементы, которые считаются известными за пределами модуля. К ним относятся объявления типов, констант, переменных и подпрограмм. Таким образом, после uses мы должны указать имена стандартных или пользовательских модулей, с которыми данный модуль установит связь. Ресурсы этих модулей будут доступны в любой точке данного модуля. При объявлении подпрограмм, т. е. процедур и функций, в секции связи указываются только их заголовки. Полные тексты процедур и функций, заголовки которых находятся в секции связи, размещаются в секции реализации.
Секция реализации начинается с ключевого слова IMPLEMENTATION и обязательно включает полные тексты подпрограмм, описанных в секции связи. Секция реализации может содержать оператор USES с набором внутренних объявлений модуля. Как обычно, в операторе USES указываются имена модулей. Внешние объявления этих модулей доступны в секции реализации: во-первых, они могут участвовать в формировании внутренних объявлений модуля и, во-вторых, могут использоваться при описании процедур и функций. В секции реализации в области внутренних объявлений можно описывать константы, типы, переменные, процедуры и функции. Эти объекты считаются известными во всех объектах секции реализации. Но внутренние объявления являются локальными, т. е. действуют только внутри того модуля, в котором они размещаются. Однако эти недоступные извне элементы могут использоваться глобальными процедурами и функциями, заголовки которых присутствуют в секции связи. Замечание. Заголовок процедуры или функции в секции реализации должен либо полностью совпадать с заголовком этой же процедуры или функции в секции связи, либо содержать только имя процедуры или функции.
Заключительной секцией модуля, которая, впрочем, чаще всего отсутствует, является секция инициализации. Она начинается с ключевого слова BEGIN. Далее обычно следует последовательность операторов языка Паскаль. Секции инициализации всех модулей, входящих в программу, выполняются один раз перед началом работы главной программы. Они используются для подготовки главной программы и модулей к началу работы и могут включать операторы, осуществляющие присваивание начальных значений переменным, открытие файлов, дополнительные проверки паролей пользователей и т.п. В секции инициализации известными считаются внешние объявления секции связи, внутренние объявления секции реализации и внешние объявления всех модулей, имена которых присутствуют в операторах USES этого модуля. Пример. unit readfile; interface var t: text; procedure display; implementation var fn:string; procedure display; var a:string; begin readln(t,a); wr1teln(a) end; Begin writeln('Введите имя файла'); readin(fn); assign(t,fn); reset(t) End. Пример главной программы: Program P_1; uses readfile;
Многомодульная программа в языке Паскаль имеет четко выраженную иерархическую структуру, которую также можно трактовать как сеть без циклов. Вершины такой сети могут быть упорядочены и распределены по уровням. Рассмотрим пример программы, содержащей 5 модулей: Uses A, B, D Модуль E Модуль D Модуль С Модуль A Главная программа Модуль В Uses E Uses C,D,E Замечание. В языке Паскаль недопустимы прямые и косвенные обращения модулей к самим себе! 1. Предположим, что в секции связи модуля C объявлена константа x. Эта константа будет размещена в сегменте данных программы до начала работы программы. Но, хотя она будет существовать в течение всего времени работы программы, из главной программы обратиться к ней невозможно, поскольку имени модуля C нет в операторе uses главной программы. 2. Пусть в главной программе и в секциях связи модулей A и D объявлена переменная од одним и тем же именем w. Понятно, что каждая из этих переменных доступна тому блоку, где описана. Однако, главной программе доступны и переменные из модулей A и D, только для обращения к ним надо использовать составные имена: A.w и D.w. В модуле A доступна переменная из модуля D. Для работы с ней надо использовать имя D.w.
3. В случае, если одни и те же данные используются большим числом модулей, то рекомендуется сформировать еще один модуль, в котором следует разместить только объявления данных. А в секциях связи данных модулей указать ссылки на модуль объявлений. |