ОСТУП К ОБЪЯВЛЕННЫМ В МОДУЛЕ ОБЪЕКТАМ




МОДУЛИ

Модуль — это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и -функции) и, возможно, некоторые исполняемые операторы инициирующей части. В них явным образом выделяется некоторая «видимая» интерфейсная часть, в которой сконцентрированы описания глобальных типов, констант и переменных, а также приводятся заголовки глобальных процедур и функций. Появление объектов в интерфейсной части делает их доступными для других модулей и основной программы. Тела процедур и функций располагаются в исполняемой части модуля, которая может быть скрыта от пользователя.

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

СТРУКТУРА МОДУЛЕЙ

Модуль имеет следующую структуру:

UNIT <имя>;

INTERFACE

<Интерфейсная часть>

IMPLEMENTATION

<исполняемая часть>

BEGIN

<инициирующая часть>

END.

Здесь UNIT зарезервированное слово (единица); начинает заголовок модуля;

<имя> — имя модуля (правильный идентификатор);

INTERFACE зарезервированное слово (интерфейс); начинает интерфейсную часть модуля;

IMPLEMENTATION — зарезервированное слово (выполнение); на­чинает исполняемую часть;

BEGIN — зарезервированное слово; начинает инициирующую часть модуля; конструкция BEGIN<инициирующая часть> необя зательна;

END — зарезервированное слово — признак конца модуля.Таким образом, модуль состоит из заголовка и трех составных частей, любая иэ которых может быть пустой.

ЗАГОЛОВОК МОДУЛЯИ СВЯЗЬ МОДУЛЕЙ ДРУГ С ДРУГОМ

Заголовок модуля состоит из зарезервированного слова UNIT и следующего за ним имени модуля. Для правильной работы среды Турбо Паскаля и возможности подключения средств, облегчающих разработку крупных программ, это имя должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Если, например, имеем заголовок

Unit Global;

то исходный текст соответствующего модуля должен размещаться в дисковом файле GLOBAL.PAS. Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением

USES <список модулей>

Здесь USES — зарезервированное слово (использует);

<список модулей > — список модулей, с которыми устанавливается связь, элементами списка являются имена модулей, отделяемые друг от друга запятыми, например:

Uses CRT, Graph, Global;

Если объявление USES... используется, оно должно открывать раздел описаний основной программы. Модули могут использовать другие модули. Предложение USES в модулях может следовать либо сразу за зарезервированным словом INTERFACE, либо сразу за словом IMPLEMENTATION, либо, наконец, и там, и там (т.е. допускаются два предложения USES).

ИНТЕРФЕЙСНАЯ ЧАСТЬ

Интерфейсная часть открывается зарезервированным словом INTERFACE. В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и/или другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, например:

Unit Cmplx;

Interface

type complex = record

re, im: real

end;

Procedure AddC (x, у: complex; var z; complex);

Procedure MulC (x, у: complex; var z: complex);

Если теперь в основной программе написать предложение Uses Cmplx то в программе станут доступными тип COMPLEX и две процедуры — ADDC и MULC из модуля CMPLX.

Отметим, что объявление подпрограмм в интерфейсной части автоматически сопровождается их компиляцией с использованием дальней модели памяти. Таким образом, обеспечивается доступ к подпрограммам из основной программы и других модулей.

Следует учесть, что все константы и переменные, объявленные в интерфейсной части модуля, равно как и глобальные константы и переменные основной программы, помещаются компилятором Турбо Паскаля в общий сегмент данных (максимальная длина сегмента 65536 байт). Порядок появления различных разделов объявлений и их количество может быть произвольным. Если в интерфейсной части объявляются внешние подпрограммы или подпрограммы в машинных
кодах, их тела (т.е. зарезервированное слово EXTERNAL, в первом
случае, и машинные коды вместе со словом INLINE — во втором) должны следовать сразу за их заголовками в исполняемой части модуля (не в интерфейсной!). В интерфейсной части модулей нельзя использовать опережающее описание.

ИСПОЛНЯЕМАЯ ЧАСТЬ

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

Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, в котором можно опускать список формальных переменных (и тип результата для функции), так как они уже описаны в интерфейсной части. Но если заголовок подпрограммы приводится в полном виде, т.е. со списком формальных параметров и объявлением результата, он должен совпадать с заголовком, объявленным в интерфейсной части, например:

Unit Cmplx;

Interface

Type

complex = record

re, itn: real

end;

Procedure AddC (x, у: complex; var z.: complex);

Implementation

Procedure AddC;

begin

z. re: = x. re + у. re;

z. im: = x. im + у. im

end;

end.

Локальные переменные и константы, а также все программные коды, порожденные при компиляции модуля, помещаются в общий сегмент памяти.

ИНИЦИИРУЮЩАЯ ЧАСТЬ

Инициирующая часть завершает модуль. Она может отсутствовать вместе с начинающим ее словом BEGIN или быть пустой — тогда за BEGIN сразу следует признак конца модуля (слово END и следующая за ним точка).

В инициирующей части размещаются исполняемые операторы, содержащие некоторый фрагмент программы. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Например, в них могут инициироваться переменные, открываться нужные файлы, устанавливаться связи с другими ПК и т.п.:

Unit FileText;

Interface

Procedure Print(s: string);

Implementation

Var

f: text;

const

name = 'output.txt';

Procedure Print;

begin

WriteLn(f, s)

end;

{ Начало инициирующей части: }

begin

assign(f, name);

rewrite(f);

{Конец инициирующей части

end.

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

КОМПИЛЯЦИЯ МОДУЛЕЙ

В среде Турбо Паскаля имеются средства, управляющие способом компиляции модулей и облегчающие разработку крупных программных проектов. В частности, определены три режима компиляции: COMPILE, MAKE и BUILD. Режимы отличаются только способом связи
компилируемого модуля или основной программы с другими модулями, объявленными в предложении USES.

При компиляции модуля или основной программы в режиме COMPILE все упоминающиеся в предложении USES модули должны быть предварительно откомпилированы и результаты компиляции помещены в одноименные файлы с расширением TPU.

В режиме MAKE компилятор проверяет наличие TPU— файлов для каждого объявленного модуля. Если какой-либо из файлов не обнаружен, система пытается отыскать одноименный файл с расширением PAS, т.е. файл с исходным текстом модуля, и, если искомый файл найден, приступает к его компиляции.

В режиме BUILD существующие ТРU—файлы игнорируются, и система пытается отыскать (и компилировать) соответствующий PAS—файл для каждого объявленного в предложении USES модуля.

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

ОСТУП К ОБЪЯВЛЕННЫМ В МОДУЛЕ ОБЪЕКТАМ

Пусть, например, мы создаем модуль, реализующий арифметику комплексных чисел (такая арифметика ни в стандартном Паскале, ни в Турбо Паскале не предусмотрена). К сожалению, в Турбо Паскале нельзя использовать функции, значения которых имели бы структурированный тип (запись, например), поэтому арифметика комплексных чисел реализуется четырьмя процедурами:

UNIT Cmplx;

INTERFACE

type

complex = record

re, im: real

end;

Procedure AddC (x, у: complex; var z: complex);

Procedure SubC (x, у: complex; var z: complex);

Procedure MulC (x, у: complex; var z: complex);

Procedure DivC (x, у: complex; var z: complex);

Const

C: complex = (re: 0.1; im: -1);

IMPLEMENTATION

Procedure AddC;

begin

z.re:= x.re + у.re;

z.im:== x.im + y.im

end {AddC};

Procedure SubC;

begin

z.re x.re - y.re;

z.im: = x. im - у. Im

end (SubC};

Procedure MulC;

begin

z.re:= x.re * y.re - x.im * y.im;

z. im: = x. re * у. im + x. im * у. re

end {MulC};

Procedure DivC;

var

zz: real;

begin

zz:= sqr(y.re) + sqr(y.im);

z.re: = (x.re * у.re + x.im * у.im) / zz;

z.im:= (x.re * y.im - x.im * y.re) / zz

end {DivC};

end.

Текст этого модуля следует поместить в файл CMPLX.PAS. Вы можете его откомпилировать, создав ТРU — файл, после чего Вашей программе станут доступны процедуры из новой библиотеки. Например, в следующей программе осуществляются четыре арифметические операции над парой комплексных чисел.

Uses Cmplx;

var

a, b, с: complex;

begin

a.re: = 1; a.im: = 1;

b.re: = 1; b.im: = 2;

AddC (a, b, c);

WriteLn ('Сложение: ', c.re:5:l, c.im:5:1,' i ');

SubC(a, b, c);

WriteLn('Вычитание: ', c.re:5:1, c.im:5:1,' i ');

MulC(a, b, c);

WriteLn('Умножение: ', c.re:5:1, c.im:5:1,'i');

DivC(a, b, c);

WriteLn('Деление: ', c.re:5:l, c.im:5:l,' i ');

end.

После объявления Uses Cmplx программе стали доступны все объекты, объявленные в интерфейсной части модуля CMPLX. При необходимости можно переопределить любой их этих объектов, как это произошло, например с объявленной в модуле типизированной константой С. Переопределение объекта означает, что вновь объявленный объект «закрывает» ранее определенный в модуле одноименный объект. Чтобы получить доступ к «закрытому» объекту, нужно воспользоваться составным именем: перед именем объекта поставить имя модуля и точку.

Например, оператор

WriteLn(cmplx.c.re:5:l, cmplx.c.im:5:l,'i');

выведет на экран содержимое «закрытой» типизированной константы из предыдущего примера.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: