
Тема: зовнішній модуль Тема: зовнішній модуль
Модуль - це програма, яка має спеціальну структуру, містить свої внутрішні описування та виконавчу частину, але сама організація роботи модуля може бути схованою, оскільки модуль розподіляється на окремі частини, не всі з котрих є доступними для користувача.
Структура модуля:
UNIT <ідентифікатор модуля> {заголовок}
I nterface
[USES <список модулів>;] {інтерфейсна секція}
<відкриті описування>;
I mplementation
[USES <список модулів>;] {секція реалізації}
<закриті описування>;
[begin <операторна частина>] {секція ініціалізації}
end.
Підключення модулів до програми
Виконується за допомогою рядка USES безпосередньо після заголовку.
При цьому стають доступними інтерфейсні("зовнішні") описування констант, змінних, процедур чи функцій цих модулів.
Модуль SYSTEM.TPU підключається автоматично.
Модуль що приєднюється розшукується компілятором:
серед резидентних модулів, завантажених у пам'ять під час запуску компілятора із бібліотеки TURBO.TPL
у поточному каталозі
у каталогах, наданих у списку каталогів файлів в меню
options/directories/unit directories
Тут надаються шляхи пошуку у форматі DOS:
\GRPH DIR;\MY DIR\OLD;\HELP;
При підключенні ряду модулів бажано виконувати правило:
якщо один модуль використовує інші, то в переліку їх у рядку uses цей модуль треба указувати після всіх модулів, які він використовує, навіть, коли вони не використовуються явно головною програмою.
Якщо один і той самий ідентифікатор зустрічається у різних модулях, то, оскільки вони компілюються у черзі слідування, виникає вкладена структура, така, що кожний внутрішній модуль відміняє призначення зовнішнього (як локальне описування по відношенню до інших)
Якщо треба отримати значення, пов'язані з конкретним модулем, треба використати кваліфікатор - ім'я модуля:
<кваліфікатор>.<ідентифікатор>
Непряме використання модулів
Якщо головна програма використовує модуль, який, в свою чергу, звертається до інших модулів, їх треба указувати у рядку uses головної програми за визначеним приоритетом.
Приклад
program host; unit unit2 unit unit1
uses unit1,unit2; interface interface
const a=b; uses unit1; const c=1;
var b:ar; const b=c; type ar=array[1..100] of byte;
begin function f(a:ar):byte; implementation
: implementation end.
Writeln(f(b)); end.
end.
Використання рядка uses у секції реалізації модуля робить посилання на інший модуль невидимим, але це посилання повинно бути зроблене перед його використанням.
Приклад
program host; unit unit2; unit unit1;
uses unit1,unit2; interface interface
var i:integer; var b:integer; const c=1;
begin implementation implementation
: uses unit1; end.
i:=b; const d=c;
: :
end. begin
b:=d;
end.
Перехресні посилання на модулі
Можна робити перехресні посилання, як правило, на процедури чи функції
unit u1 unit u2
interface interface
implementation implementation
uses u2; uses u1;
: :
end. end.
Такі перехресні посилання можуть виконуватись тільки у секції реалізації, також треба слідкувати, щоб описування з'являлись до їх використання. У цьому випадку інтерфейсні секції можуть бути скомпоновані за загальним правилом (у прикладі - у будь-якому порядку, оскільки інтерфейсні секції не залежать одна від одної).