Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_2_02.rtf
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
101.88 Кб
Скачать
    1. Как используются модули?

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

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

Фактически, если модуль скомпилирован, его использование сохраняет вам время при перекомпиляции. Поскольку компилятор не перекомпилирует модуль, пока он не изменяется, использование модулей в программе ускорит процесс ее построения.

Как указывалось ранее, для использования специального модуля или набора модулей необходимо в начале программы поместить оператор uses, после которого указать список имен тех модулей, которые будут использоваться. Имена их должны разделяться запятыми:

program MyProg;

uses thisUnit, thatUnit, theOtherUnit;

Когда компилятор встречает такой оператор uses, он прибавляет информацию из секции интерфейса каждого модуля к таблице идентификаторов и присоединяет машинный код, представленный в секции реализации, к самой программе.

Модули присоединяются к таблице идентификаторов в указанном порядке. Порядок модулей в операторе uses значения не имеет. Если модуль thisUnit использует thatUnit или наоборот, вы можете описать их в любом порядке, а компилятор определит, какой модуль нужно скомпоновать с программой MyProg первым. Фактически, если модуль thisUnit использует thatUnit, но MyProg не вызывает непосредственно ни одну из подпрограмм в модуле thatUnit, вы можете "скрыть" подпрограммы модуля thatUnit, опустив его в операторе uses:

unit thisUnit;

uses thatUnit;

.

.

.

program MyProg;

uses thisUnit, theOtherUnit;

.

.

.

В этом примере модуль thisUnit может вызывать любую подпрограмму модуля thatUnit, а программа MyProg может вызывать любую из подпрограмм модуля thisUnit или theOtherUnit. Однако, программа MyProg не может вызывать подпрограммы модуля thatUnit, поскольку thatUnit не указывается в операторе uses программы MyProg.

Если в программе не указан оператор uses, Borland Pascal в любом случае присоединит стандартный модуль System. Этот модуль обеспечит выполнение некоторых стандартных подпрограмм Borland Pascal, а также нескольких подпрограмм, специфических для Borland Pascal.

    1. Ссылки на описания модуля

Как только вы включили модуль в свою программу, все константы, типы данных, переменные, процедуры и функции, описанные в секции интерфейса этого модуля, становятся доступными для вашей программы. Например, допустим, имеется следующий модуль:

unit MyStuff;

interface

const

MyValue = 915;

type

MyStars = (Deneb,Antares,Betelgeuse);

var

MyWord : string[20];

procedure SetMyWord(Star : MyStars);

function TheAnswer : integer;

implementation

.

.

.

end.

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

program TestStuff;

uses MyStuff;

var

I : integer;

AStar : MyStars;

begin

Writeln(myValue);

AStar := Deneb;

SetMyWord(AStar);

Writeln(MyWord);

I := TheAnswer;

Writeln(I)

end.

После включения в программу оператора uses MyStuff вы можете ссылаться на все идентификаторы, описанные в интерфейсной секции модуля МyStuff (МyWord, МyValue и так далее). Однако, рассмотрим следующую ситуацию:

program TestStuff;

uses MyStuff;

const

MyValue = 22;

var

I : integer;

AStar : MyStars;

function TheAnswer : integer;

begin

TheAnswer := 1

end;

begin

Writeln(myValue);

AStar := Deneb;

SetMyWord(AStar);

Writeln(MyWord);

I := TheAnswer;

Writeln(I)

end.

В этой программе переопределяются некоторые из идентификаторов, описанных в МyStuff. Будучи скомпилированной и выполненной, эта программа будет использовать собственные определения для МyValue и ТheAnswer, поскольку они были описаны позднее, чем определения в МyStuff.

Вероятно, вам интересно знать, каким образом в такой ситуации можно ссылаться на идентификаторы в МyStuff. Для этого необходимо перед каждым идентификатором помещать имя МyStuff с точкой (.). Например, рассмотрим еще одну версию этой программы:

program TestStuff;

uses MyStuff;

const

MyValue = 22;

var

I : integer;

AStar : MyStars;

function TheAnswer : integer;

begin

TheAnswer := 1

end;

begin

Writeln(MyStuff.MyValue);

AStar := Deneb;

SetMyWord(AStar);

Writeln(MyWord);

I := MyStuff.TheAnswer

Writeln(I)

end.

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

program TestStuff;

uses MyStuff;

var

I : integer;

AStar : MyStuff.MyStars;

begin

Writeln(MyStuff.MyValue);

AStar := My.Stuff.Deneb;

MyStuff.SetMyWord(AStar);

Writeln(My.Stuff.MyWord);

I := MyStuff.TheAnswer;

Writeln(I)

end.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]