- •Курсовая работа
- •Задание
- •2.3 Компиляция и использование модулей 22
- •2.5 Пример модуля 30
- •Перемножение двух матриц 35
- •2.1 Общая структура модуля
- •2.3 Компиляция и использование модулей
- •Компиляция модулей: tpu-файлы
- •Компиляция: поиск модулей. Файл turbo.Tpl
- •2.4 Стандартные модули
- •2.5 Пример модуля
- •2.5 Синтаксические диаграммы
- •I, j: byte;
2.1 Общая структура модуля
В языке Turbo Pascal модуль (unit) по определению считается отдельной программой. Если подпрограмма является структурным элементом Pascal-программы и не может существовать вне ее, то модуль представляет собой отдельно хранимую и независимо компилируемую единицу. С учетом этого факта можно дополнить рассмотрение общей структуры Pascal-программы следующей синтаксической диаграммой для случая языка Turbo Pascal (рисунок 3):
Рисунок 3 - Программа на языке Turbo Pascal
В самом общем виде модуль представляет собой совокупность (коллекцию) программных ресурсов, предназначенных для использования другими модулями и программами. Под ресурсами в данном случае понимаются любые программные объекты языка Turbo Pascal - константы, типы, переменные, подпрограммы. Важно понимать, что модуль сам по себе не является выполняемой программой - его объекты ИСПОЛЬЗУЮТСЯ другими программными единицами.
Все программные ресурсы модуля можно разбить на две части: объекты, прямо предназначенные для использования другими программами или модулями, и объекты рабочего характера. Например, если модуль содержит некоторую подпрограмму универсального назначения, пригодную для использования другими программами, то, скажем, вызываемые этой подпрограммой процедуры и функции, содержащиеся в модуле, и используемые ею переменные имеют сугубо внутренний характер. В соответствии с этим модуль, кроме заголовка, имеет две основные части, называемые интерфейсом и реализацией.
В интерфейсной части модуля сосредоточены описания объектов, доступных из других программ; такие объекты называют видимыми вне модуля. В части реализации помещаются рабочие объекты, называемые также невидимыми или скрытыми.
Заголовок модуля составляется из служебного слова unit и следующего за ним идентификатора, являющегося именем модуля. Заголовок завершается символом ';' (точка с запятой). Интерфейсная часть начинается со служебного слова interface, за которым следует совокупность обычных описаний. Часть реализации начинается служебным словом implementation, за которым идут описания скрытых объектов. Завершает модуль, как и программу, служебное слово end и символ '.' (точка).
Кроме перечисленных частей, модуль может содержать так называемый раздел инициализации, предназначенный для установки начальных значений переменных модуля перед его использованием. Этот раздел следует после раздела реализации, начинается со служебного слова begin и содержит последовательность операторов.
Таким образом, общая структура модуля может быть представлена следующей схемой (рисунок 4) :
Рисунок 4
Приведем простейший пример модуля. Для того, чтобы избежать многократного описания в различных программах некоторых общеупотребительных типов данных, молено сосредоточить их в одном модуле. Данный пример касается описаний, связанных с датами, месяцами, днями и т.д.
unit Calendar;
interface
type
Days = (Mon,Tue,Wed,Thu,Fri,Sat,Sun);
WorkingDays = Mon..Fri;
Months = (Jan,Feb,Mar,Apr,May,June,
July,Aug,Sept,Oct,Nov,Decem);
Summer = June..Aug;
Autumn = Sep..Nov;
Spring = Mar..May;
DayNo = 1..31;
YearNo = 1900..2000;
Date = record
Day : DayNo;
Month : Months;
Year : YearNo
end;
implementation
end.
Данный модуль, ввиду своей простоты, не содержит разделов реализации и инициализации. Механизм использования модулей в других программах будет описан далее.
2.2 Подпрограммы в модулях
Процедуры и функции могут использоваться в модулях наравне с другими Pascal-объектами. Однако для них имеются особенности, обусловленные их структурой. Как уже отмечалось, заголовок подпрограммы содержит всю информацию, необходимую для ее вызова: ее имя, количество и типы параметров и (для функций) тип результата. С другой стороны, тело подпрограммы содержит блок, раскрывающий ее алгоритм. Можно считать, что заголовок подпрограммы является ее интерфейсом, а тело - реализацией. В соответствии с этой точкой зрения в интерфейсной части модуля должны быть представлены только ЗАГОЛОВКИ процедур и функций, видимые (доступные) для других программ (аналогично предварительным описаниям, но без служебного слова forward), а их полные описания будут содержаться в разделе реализации. При этом полное описание подпрограммы может иметь СОКРАЩЕННЫЙ заголовок, состоящий только из служебного слова procedure или function, имени подпрограммы и символа ';'. (Разумеется, можно повторить полный заголовок подпрограммы, но тогда он должен быть точно таким же, как и заголовок в интерфейсной части).
В качестве примера можно привести модуль, содержащий средства работы с комплексными числами
unit CmplVals;
interface
type
Complex = record { способ представления комплексных чисел }
Re, Im : real
end;
{ Заголовки процедур, реализующих
операции над комплексными числами }
procedure InitC (R,I:real; Var C:Complex);
procedure AddC (Cl,C2:Complex;var R:Complex);
procedure MultC (Cl,C2:Complex;var R:Complex);
procedure DivC (Cl,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 := Cl.Re + C2.Re;
Im := Cl.Im + C2.Im
end
end;
procedure MultC;
begin
with R do
begin
Re := Cl.Re*C2.Re+Cl.Im+C2.Im;
Im := Cl.Im*C2.Re+Cl.Re*C2.Im
end
end;
procedure DivC;
var
Tmp : real;
begin
with C2 do Tmp:=Re*Re+Im*Im;
with R do
begin
Re := (Cl.Re*C2.Re+Cl.Im*C2.Im)/Tmp;
Im := (C2.Re*Cl.Im+Cl.Re*C2.Im)/Tmp
end
end;
procedure WriteC;
begin
with С do
begin
Write(Re);
if Im=0 then Exit;
if Im>0 then Write(’+’);
Write(Im);
Write('i')
end
end;
end.
Таким образом, механизм модулей позволяет скрыть детали реализации тех или иных программных подсистем,
предоставив в распоряжение использующих программ строго определенную совокупность интерфейсных объектов. Если необходимо, например, расширить модуль CmplVals введением новых процедур или изменить реализацию какой-либо процедуры, то если интерфейс модуля при этом останется неизменным, такая модификация НИКАК НЕ ОТРАЗИТСЯ на использующих программах.
