ОВЕРЛЕЙ

Использование модулей

Пример

Cекция инициализации

В некоторых случаях перед обращением к модулю следует провести его инициализацию (например, установить связь с теми или иными файлами с помощью процедуры Assign). Необходимые действия можно выполнить в секции инициализации модуля. Эта секция начинается, словом begin, после которого идут исполняемые операторы, а затем помещается слово end.

Операторы секции инициализации выполняются единственный раз в момент запуска программы.

Если инициализация модуля не нужна, то в секции помещается лишь слово end.

Модуль, содержащий средства работы с комплексными числами:

 

unit Cmp;

interface

туре

Complex=record{способ представления}

Re,Im:real {комплексных чисел}

end;

{Заголовки процедур, реализуют операции над комплексными числами}

procedure InitC (c:Complex;R,I:real);

procedure AddC (c1,c2:Complex;var R:Complex);

procedure MaltC (c1,c2:Complex;var R:Complex);

procedure DivC (c1,c2:Complex;var R:Complex);

procedure WriteC(c:Complex);

implementation

{полные описания процедур (с сокращенными заголовками)}

procedure InitC;

begin

with c do

begin

Re:=R;

Im:=I;

end;

end;

procedure AddC;

begin

with R do

begin

Re:=c1.Re+c2.Re;

Im:=c1.Im+c2.Im;

end;

end;

procedure MaltC;

begin

with R do

begin

Re:=c1.Re*c2.Re+c1.Im*c2.Im;

Im:=c1.Im*c2.Re+c1.Re*c2.Im;

end;

end;

procedure DivC;

var

Tmp:real;

begin

with c2 do Tmp:=Re*Re+Im*Im;

with R do

begin

Re:=(c1.Re*c2.Re+c1.Im*c2.Im)/Tmp;

Im:=(c2.Re*c1.Re+c1.Re*c2.Im)/Tmp;

end

end;

procedure WriteC;

begin

with c do

begin

write(Re);

if Im=0 then exit;

if Im<>0 then write('+');

write(Im);

write('i');

end;

end;

end.

 

 

Program Complex;

uses Cmp;

var

c1,c2,c3:Complex;

begin

InitC(1,2,c1);

InitC(3,4,c2);

MultC(c1,c2,c3);

DiveC(c1,c2,c3);

WriteC(c3);

write(c3);

end.

 

Модуль компилируется как обычный файл.Поскольку он не является непосредственно выполняемой единицей, то в результате его компиляции образуется дисковый файл с расширением .tpu(Turbo Pascal unit). При этом имя файла берется из имени файла с исходным текстом модуля.

Для того чтобы получить доступ к интерфейсным объектам модуля, необходимо указать в программе имя нужного tpu-файла.

Конструкция имеет следующий общий вид:

Uses v1, v2, v3; (v1, v2, v3-имена используемых модулей)

Если некоторый модуль использует объекты другого модуля, то такие спецификаторы должны следовать сразу же после слова interface

При решении реальных задач в среде Турбо Паскаль возможен случай нехватки основной памяти. Для преодоления этой трудности имеется механизм, который называется оверлейным. Его применение позволяет разрабатывать Паскаль-программы, размер которых больше размера основной памяти. Основным принципом оверлейного механизма является представление программы в виде отдельных блоков, которые по переменно могут занимать одну и ту же область основной памяти. При этом необходимый блок загружается в основную память, вытесняя оттуда ранее выполнявшийся блок.

Оверлейный механизм достаточно широко распространен и применяется не только в Турбо Паскале. Оверлейная программа выполняется медленней, чем аналогичная неоверлейная, поскольку требуется время на загрузку и выгрузку отдельных блоков.

Средства построения оверлейных программ в Турбо Паскале базируется на следующих основных принципах:

1) Оверлейная программа должна быть реализована следующим образом:

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

2) Оверлейные блоки должны быть оформлены в виде модулей, снабженных специальной директивой {$0+}.

3) Все средства управления оверлеями сосредоточены в стандартном модуле OVERLAY. Поэтому никаких специальных языковых конструкций оверлейный механизм не предусматривает.

4) При трансляции оверлейной программы компилятор Турбо Паскаля работает следующим образом: управляющая часть программы (неоверлейная) оформляется в виде еxe-файла, все оверлейные блоки, оформляются в виде одного файла с расширением OVR. Таким образом при компиляции все файлы собираются в один файл с расширением OVR.

5) Все обращения к оверлейным процедурам и функциям должны осуществляться по средствам дальнего типа вызова. Для этого подпрограммы или оверлейный модуль вцелом снабжаются специальной директивой F с которой они должны компилироваться {$F+}. Турбо Паскаль при отсутствии специальной директивы автоматически выбирает адресацию к подпрограмме. Если подпрограмма находится в одном файле с основной программой, то она компилируется с ближним адресом входа и возврата (near). Этот адрес состоит только из смещения в текущем сегменте.

Если подпрограмма находится в модуле (unit), то она компилируется с дальним адресом (far), который состоит из адреса сегмента и смещения. Если требуется нестандартная компиляция, то есть размещение подпрограммы, которая находится в одном файле с основной программой то используется директива F+.

6) Основная часть (управляющая ) оверлейной программы должна содержать предложение USES, в котором перечисляются используемые оверлейные модули. В этом же предложении могут быть указаны так же и не оверлейные модули. Но первым в этом предложении обязательно должен быть указан модуль OVERLAY. Вслед за предложением USES должны размещаться директивы компилятора, которые указывают, какие модули в предложении USES являются оверлейными. Каждая такая директива имеет вид

{$0 имя модуля} имя модуля должно совпадать с именем дискового файла, в котором находится оверлейный модуль.

7) В теле управляющей программы перед первым обращением к какой-либо оверлейной подпрограмме должен быть вызов стандартной процедуры OVRInit из модуля OVERLAY. Эта процедура инициализирует систему управления оверлеями. У этой процедуры всего один параметр, который является строкой с именем того файла, в котором собраны коды оверлейных модулей.

Например:

Составить программу с оверлейной структурой, состоящей из управляющей части с именем PrimOVR и двух оверлейных модулей ModOVR1, ModOVR2 каждый из которых содержит по одной процедуре вывода текстовой информации.

{$F+,0+};

Program PrimOVR;

Uses Overlay,printer,ModOVR1, ModOvr2$

{$0 ModOVR1};

{$0 ModOVR2};

BEGIN

OVRInit (‘PrimOVR.OVR’);

Vivod 1;

Vivod 2;

END.

 

Далее запишем модули Unit каждый из которых содержит по одной процедуре.

 

{$0+,F+};

Unit ModOVR1;

interface

procedure vivod 1;

inplementation

procedure vivod 1;

BEGIN

Writeln(‘ Модуль 1’);

END;

END;

 

{$0+,F+};

Unit ModOVR 2;

interface

procedure vivod 2;

inplementation

procedure vivod 2;

BEGIN

Writeln(‘Модуль 2 ’);

END;

END.