|
|
Лекция 8
|
 |
 |
|
|
1.
Необходимость использования модулей. |
|
|
Программа, написанная на языке
Паскаль, состоит из главной программы и возможно нескольких
модулей. Тексты главной программы и модулей размещаются в
различных файлах. Выполнение всегда начинается с главной
программы; операционная система осуществляет вызов того файла с
расширением .ЕХЕ, который содержит код главной программы. |
|
|
Использование процедур и функций
в программе, написанной на языке Паскаль, позволяет четко
организовать и структурировать такую программу. Однако, зачастую
размер главной программы может резко увеличиться за счет
расположенных в ней подпрограмм. Кроме того, распределение задач
между программистами и программами затруднено за счет
структурного и информационного объединения подпрограмм. И
наконец, малейшие изменения в тексте программы приведет к ее
повторной компиляции. Решение указанных проблем привело к
появлению в составе языка особых структурных единиц – модулей. |
|
|
Модуль
- это программная единица, допускающая автономную компиляцию.
Выполнение модуля может инициироваться главной программой или
другими модулями. Делается это с помощью вызова процедуры или
функции, входящей в состав модуля. |
|
|
В языке
Паскаль в состав модуля могут входить несколько процедур и
функций. Исполняемый код модуля размещается в отдельном сегменте
памяти, а не в сегменте главной программы. |
|
|
|
Структура
модуля напоминает структуру программы, хотя налицо и
существенные различия. |
|
unit <имя модуля>
Секция interface
связи uses <список_1 имен модулей>;
<внешние объявления>
Секция implementation
реализации uses <список_2 имен модулей>;
<внутренние объявления>
Секция Begin
инициализации <операторы>
End.
|
|
Модуль
обязательно начинается с ключевого слова unit, за которым
следует идентификатор – имя модуля. |
|
|
Имя модуля
обязательно должно совпадать с именем файла с расширением .pas,
в котором хранится модуль. |
|
|
unit my_library
хранится в файле
my_library.pas |
|
|
Завершается
модуль, так же, как и главная программа, ключевым словом END с
точкой. |
|
|
Имя модуля
служит для организации связи модуля с главной программой и
другими модулями. Связь между модулями устанавливается с помощью
оператора USES. |
|
|
Секция
связи начинается с оператора USES, следом за которым должны
размещаться так называемые внешние объявления. Внешние
объявления описывают элементы, которые считаются известными за
пределами модуля. К ним относятся объявления типов, констант,
переменных и подпрограмм. Таким образом, после uses мы должны
указать имена стандартных или пользовательских модулей, с
которыми данный модуль установит связь. Ресурсы этих модулей
будут доступны в любой точке данного модуля. |
|
|
При
объявлении подпрограмм, т. е. процедур и функций, в секции связи
указываются только их заголовки. Полные тексты процедур и
функций, заголовки которых находятся в секции связи, размещаются
в секции реализации. |
unit my_library;
interface
uses crt;
const n=5, m=6;
type mass = array [1..m] of integer;
matr = array [1..n] of mass;
procedure gen_1(a,b:integer; k:byte; var t:mass);
procedure gen_2(a,b:integer; k,l:byte; var tt:matr);
function prostoe(x: longint): boolean;
При таком описании из главной программы и из любого модуля, который
подключает к себе модуль my_library, а кроме того, в любой точке модуля
my_library будут доступны:
|
|
ü |
процедуры
gen_1 и gen_2; |
|
|
Секция
реализации начинается с ключевого слова IMPLEMENTATION и
обязательно включает полные тексты подпрограмм, описанных в
секции связи. |
|
|
Секция
реализации может содержать оператор USES с набором внутренних
объявлений модуля. Как обычно, в операторе USES указываются
имена модулей. Внешние объявления этих модулей доступны в секции
реализации: во-первых, они могут участвовать в формировании
внутренних объявлений модуля и, во-вторых, могут использоваться
при описании процедур и функций. |
|
|
В секции
реализации в области внутренних объявлений можно описывать
константы, типы, переменные, процедуры и функции. Эти объекты
считаются известными во всех объектах секции реализации. Но
внутренние объявления являются локальными, т. е. действуют
только внутри того модуля, в котором они размещаются. Однако эти
недоступные извне элементы могут использоваться глобальными
процедурами и функциями, заголовки которых присутствуют в секции
связи. |
|
|
Заголовок
процедуры или функции в секции реализации должен либо полностью
совпадать с заголовком этой же процедуры или функции в секции
связи, либо содержать только имя процедуры или функции. |
implementation
uses graph;
const z=200; z1=300; z2=400;
var str:string[20];
function prostoe;
var q:boolean; i, r: longint;
begin
q:=true;
if x mod 2 =0 then q:=false;
r:= trunk(sqrt(x));
i:=3;
while q and (i<=r) do
if x mod i =0 then q:=false
else i:=i+2;
prostoe:=q
end;
|
|
Заключительной секцией модуля, которая, впрочем, чаще всего
отсутствует, является секция инициализации. Она начинается с
ключевого слова 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('Введите имя файла');
Пример главной программы:
Program P_1;
uses readfile;
Begin
display;
End.
|
|
4. |
Организация связей между программными модулями. |
|
|
Многомодульная программа в языке Паскаль имеет четко выраженную
иерархическую структуру, которую также можно трактовать как сеть
без циклов. Вершины такой сети могут быть упорядочены и
распределены по уровням. |
|
|
Рассмотрим
пример программы, содержащей 5 модулей: |

|
|
В языке
Паскаль недопустимы прямые и косвенные обращения модулей к самим
себе! |
|
|
1.
Предположим, что в секции связи модуля C объявлена константа x.
Эта константа будет размещена в сегменте данных программы до
начала работы программы. Но, хотя она будет существовать в
течение всего времени работы программы, из главной программы
обратиться к ней невозможно, поскольку имени модуля C нет в
операторе uses главной программы. |
|
|
2. Пусть в
главной программе и в секциях связи модулей A и D объявлена
переменная од одним и тем же именем w. Понятно, что каждая из
этих переменных доступна тому блоку, где описана. Однако,
главной программе доступны и переменные из модулей A и D, только
для обращения к ним надо использовать составные имена: A.w и D.w.
|
|
|
В модуле A
доступна переменная из модуля D. Для работы с ней надо
использовать имя D.w. |
|
|
3. В
случае, если одни и те же данные используются большим числом
модулей, то рекомендуется сформировать еще один модуль, в
котором следует разместить только объявления данных. А в секциях
связи данных модулей указать ссылки на модуль объявлений. |
 |