- •Курсовая работа
- •Задание
- •2.3 Компиляция и использование модулей 22
- •2.5 Пример модуля 30
- •Перемножение двух матриц 35
- •2.1 Общая структура модуля
- •2.3 Компиляция и использование модулей
- •Компиляция модулей: tpu-файлы
- •Компиляция: поиск модулей. Файл turbo.Tpl
- •2.4 Стандартные модули
- •2.5 Пример модуля
- •2.5 Синтаксические диаграммы
- •I, j: byte;
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. Если в модуле имеется раздел инициализации, то операторы из этого раздела будут выполнены ПЕРЕД началом выполнения программы, в которой используется данный модуль. Если программа использует несколько модулей, то их разделы инициализации будут выполнены в том же порядке, в котором эти модули перечислены в спецификации использования.
