Читайте также:
|
|
Рассмотрим следующие программу и два модуля:
Program MainProg; { Выводит текст, используя WriteXY }
Uses Crt, Display;
Begin
ClrScr;
WriteXY (1, 1, ‘ Левый верхний угол экрана ’);
WriteXY (100, 100, ‘ За пределами экрана ’);
WriteXY (81 - Length (‘ Снова в экран… ’), 15, ‘ Снова в экран… ’)
End.
Unit Display; { Содержит процедуру вывода WriteXY }
Interface
Procedure WriteXY (X, Y: Integer; Message: String);
Implementation
Uses
Crt, Error;
Procedure WriteXY;
Begin
If (X in[1 .. 80]) and (Y in[1 .. 25])
Then
Begin
gotoXY (X, Y);
Write (Message)
End
Else
ShowError (‘ Неверные координаты в WriteXY ’)
End
End.
Unit Error; { Содержит процедуру обработки ошибки }
Interface
Procedure ShowError (ErrMsg: String);
Implementation
Uses
Display;
Procedure ShowError;
Begin
WriteXY (1, 25, ‘ Ошибка: ’ + ErrMsg)
End
End.
Видим, что основная программа MainProg использует модуль Display, который содержит в своей интерфейсной секции одну процедуру WriteXY. Последняя перемещает курсор в заданную точку и выводит там заданное сообщение. В противном случае она вызывает процедуру обработки ошибки ShowError, которая содержится в модуле Error. Когда процедура обработки ошибки будет выводить сообщение на экран, начинаются циклические ссылки — она использует процедуру WriteXY из Display.
Видим также, что предложения Uses в секции реализации обоих модулей ссылаются друг на друга (что и обеспечивает возможность циклических ссылок). Это можно сделать потому, что компилятор может для обоих модулей выполнить полную компиляцию интерфейсных секций.
Другими словами, компилятор воспринимает ссылку на частично скомпилированный модуль A в секции реализации модуля B, если интерфейсные секции модулей A и B не зависят друг от друга.
Совместное использование описаний
Введем в процедуры из предыдущего примера дополнительный параметр, задающий прямоугольное окно на экране:
Procedure WriteXY (SomeWindow: WindRec; X, Y: Integer; Message: String);
Procedure ShowError (SomeWindow: WindRec; ErrMsg: String);
Две процедуры находятся в разных модулях. Даже если описать WindRec в интерфейсной секции одного модуля, то это описание не будет доступно в другом модуле. Выход состоит в том, чтобы описать третий модуль, в котором содержится только описание записи WindRec:
Unit WindData;
Interface
Type
WindRec = Record
X1, Y1, X2, Y2: Integer;
...
End;
Implementation
End.
Теперь необходимо в интерфейсной секции модулей Display и Error в предложении Uses добавить имя модуля WindData. Это допустимо, т.к. модуль WindData не зависит от своего предложения Uses, а модули Display и Error ссылаются друг на друга только в секциях реализации.
Дата добавления: 2015-02-16; просмотров: 84 | Поможем написать вашу работу | Нарушение авторских прав |