https://electroinfo.net

girniy.ru 1



Модули

Модули в языке Паскаль.

1. Необходимость использования модулей.


Программа, написанная на языке Паскаль, состоит из глав­ной программы и возможно нескольких модулей. Тексты глав­ной программы и модулей размещаются в различных файлах. Выполнение всегда начинается с главной программы; операци­онная система осуществляет вызов того файла с расширением .ЕХЕ, который содержит код главной программы.

Использование процедур и функций в программе, написанной на языке Паскаль, позволяет четко организовать и структурировать такую программу. Однако, зачастую размер главной программы может резко увеличиться за счет расположенных в ней подпрограмм. Кроме того, распределение задач между программистами и программами затруднено за счет структурного и информационного объединения подпрограмм. И наконец, малейшие изменения в тексте программы приведет к ее повторной компиляции. Решение указанных проблем привело к появлению в составе языка особых структурных единиц – модулей.

Модуль - это программная единица, допускающая автоном­ную компиляцию. Выполнение модуля может инициироваться главной программой или другими модулями. Делается это с по­мощью вызова процедуры или функции, входящей в состав мо­дуля.

2.Структура модуля.


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

Структура модуля напоминает структуру программы, хотя налицо и существенные различия.

unit <�имя модуля

Секция interface

связи uses <�список_1 имен модулей>;

<�внешние объявления>

Секция implementation

реализации uses <�список_2 имен модулей>;

<�внутренние объявления>

Секция Begin

инициализации <�операторы>

End.

Модуль обязательно начинается с ключевого слова unit, за которым следует идентификатор – имя модуля.

Замечание.

Имя модуля обязательно должно совпадать с именем файла с расширением .pas, в котором хранится модуль.

Пример.

unit my_library хранится в файле my_library.pas

Завершается модуль, так же, как и главная программа, ключевым словом END с точкой.

Имя модуля служит для организации связи модуля с главной программой и другими модулями. Связь между модуля­ми устанавливается с помощью оператора USES.

  1. Секция связи.

Секция связи начинается с оператора 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 будут доступны:


  • константы n и m;

  • типы mass и matr;

  • процедуры gen_1 и gen_2;

  • функция prostoe.

  1. Секция реализации.

Секция реализации начинается с ключевого слова 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;


  1. Секция инициализации.

Заключительной секцией модуля, которая, впрочем, чаще все­го отсутствует, является секция инициализации. Она начинается с ключевого слова 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;


Begin

display;

End.


  1. Организация связей между программными модулями.

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

Рассмотрим пример программы, содержащей 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.


Главная программа

Uses A, D





Модуль A

Uses D





Модуль D






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