Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая по ит.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
484 Кб
Скачать
☆

2.3 Компиляция и использование модулей

Модуль компилируется точно таким же образом, как и обы­чные подпрограммы; возможна компиляция из интегриро­ванной среды или с помощью компилятора командной стро­ки. Но так как модуль не является непосредственно выпол­няемой единицей, то в результате его компиляции образует­ся дисковый файл с расширением .TPU (Turbo Pascal Unit), при этом имя файла берется из имени файла с исходным тек­стом модуля.

Для того, чтобы получить доступ к интерфейсным объек­там модуля, необходимо указать в программе имя нужного ТРU-файла. Соответствующая конструкция называется спе­цификацией используемых модулей и имеет следующий об­щий вид:

uses U1, U2, U3;

где uses - служебное слово, U1, U2, UЗ - идентификаторы ис­пользуемых модулей. Эта спецификация должна идти непо­средственно после заголовка программы; если некоторый модуль использует объекты другого модуля, то такая специ­фикация должна следовать сразу после служебного слова interface.

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

Следующий пример иллюстрирует использование модуля CmplVals:

program DaingComplex;

uses

CmplVals;

var

C1, C2, C3 : Complex;

begin

InitC(1,2,C1); InitC(3,4,C2);

MultC(C1,C2,C3); WriteC(C3);

DivC(C1,C2,C3); WriteC(C3)

end.

Необходимо особо отметить следующие важные момен­ты, связанные с использованием модулей:

1. Может случиться так, что идентификаторы интерфейсной части используемого модуля частично пересекаются с идентификаторами использующей программы. В этом случае действует следующее правило видимости имен: ин­терфейсные идентификаторы модуля, указанного первым в uses-списке, образуют самый внешний блок программы; интерфейсные идентификаторы второго модуля образуют блок, вложенный в первый блок, и т.д. Если, например, в программе имеется спецификация вида uses А, В; то вложенность блоков выглядит так:

Таким образом, идентификаторы внешнего блока про­граммы будут "экранировать" одноименные идентификаторы модулей А и В; аналогично, идентификаторы модуля А будут перекрыты одноименными идентификаторами модуля В.

Однако, существует возможность доступа к интерфейсу используемого модуля несмотря на наличие в программе одноименных идентификаторов. Пусть имеется следую­щий модуль:

unit А;

interface

var

X:real;

implementation

...

end.

Далее, пусть программа, использующая этот модуль, так­же содержит переменную X:

program Р;

uses А;

var X : integer;

begin

...

end.

Для того чтобы в программе Р иметь доступ к интерфейс­ной переменной X из модуля А, необходимо задать состав­ное имя, структура которого похожа на селектор поля за­писи:

А.Х

Здесь А - имя модуля, X - идентификатор его интерфейс­ной переменной. В этом случае конфликт имен снимается, так как простое указание имени X будет означать обраще­ние к соответствующей переменной из программы Р, на­пример: А.Х := Round(X);

2. Возможны случаи косвенных использований. Например, пусть имеются два модуля:

unit A;

interface

. . .

end.

unit B;

interface

uses A;

. . .

end.

Если некоторая программа использует модуль B, то в со­ответствующей спецификации использования необходимо указать только модули, НЕПОСРЕДСТВЕННО используе­мые в программе. В данном примере достаточной являет­ся следующая спецификация:

program P;

uses В;

. . .

end.

(Необходимо отметить, что в фирменной документации по системе Turbo Pascal можно встретить и противопо­ложное требование, согласно которому в спецификации использования должны быть указаны ВСЕ модули, прямо или косвенно используемые программой. Однако из прак­тики видно, что компилятор правильно обрабатывает программы, в спецификации использования которых ука­заны только модули, непосредственно используемые ею).

3. Схема использования модулей может образовывать древо­видную структуру любой сложности, но при этом недопу­стимо явное или косвенное обращение модуля к самому себе. Так например, следующие отношения являются оши­бочными:

unit A;

interface

uses B;

. . .

end.

unit B;

interface

uses A;

. . .

end.

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

4. Если в модуле имеется раздел инициализации, то операто­ры из этого раздела будут выполнены ПЕРЕД началом вы­полнения программы, в которой используется данный мо­дуль. Если программа использует несколько модулей, то их разделы инициализации будут выполнены в том же по­рядке, в котором эти модули перечислены в специфика­ции использования.