trains_hr.gif
 


В ПОМОЩЬ СТУДЕНТУ И ШКОЛЬНИКУ

 


Горбачев Л.И. Основы программирования в среде Turbo Pascal.

[НАЗАД]  [ДАЛЕЕ]

3. Организация собственного модуля программиста.

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

   Каждый модуль аналогичен отдельной программе, т.е. имеет: главное тело, которое вызывается перед стартом программы и производит необходимые действия по инициализации, когда это необходимо. Каждый модуль - это библиотека объявлений, которую можно вставить и использовать внутри программы, что позволяет разделить программу на части и компилировать их отдельно. Например, модуль CRT содержит все объявления для программ работы с экраном.

   3.1. Структура модуля.

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

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

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

    Структура модуля похожа на структуру программы, но имеет и отличия:
unit имя_модуля;
interface { Раздел интерфейса }
uses список_модулей;
{ Общие объявления. Список процедур и функций с указанием параметров }
implementation { Раздел реализации }
uses список_модулей;
{ Личные объявления. Реализация процедур и функций }
begin { Раздел инициализации }
{ код инициализации }
end.

   Заголовок модуля - слово UNIT, за которым следует имя модуля. Следующий элемент - ключевое слово INTERFACE. Это слово обозначает начало раздела интерфейса модуля, доступного для всех других модулей и программ, использующих этот модуль. В предложении uses указываются модули, которые может использовать этот модуль.

    Слово uses может появляться в двух местах:
- сразу же после слова interface; в этом случае, константы или типы данных, объявленные в интерфейсах этих модулей, могут быть использованы в любых объявлениях;
- сразу же после слова implementation; в этом случае, любые объявления этого модуля могут использоваться только внутри раздела реализации. Это так же допускает циклические ссылки модулей.

   3.2. Раздел интерфейса.

    Это "открытая" часть модуля, она начинается ключевым словом INTERFACE, следующим сразу за заголовком, и ограничена ключевым словом IMРLЕMENTATION. Интерфейс определяет, что является видимым (доступным) для некоторой программы (или других модулей), использующих этот модуль. Любая программа, использующая этот модуль, имеет доступ к этим видимым элементам. В интерфейсе модуля можно объявить константы, типы данных, переменные, процедуры и функции.

    Процедуры и функции, доступные для программы, использующей этот модуль описываются в разделе интерфейса. А их действительные тела - операторы, реализующие их, - в разделе реализации. Объявление forward не разрешается.

    Тела всех обычных процедур и функций находятся в разделе реализации после раздела интерфейса, в котором перечислены их имена и заголовки. uses может появиться и в разделе implementation. Если в разделе реализации имеет место uses, то это слово следует сразу же за словом implementation.

   3.3. Раздел реализации.

    Раздел реализации - закрытая, недоступная часть - начинается со слова IMPLEMENTATION. Все, что объявлено в части интерфейса видимо для раздела реализации: константы, типы, переменные, процедуры и функции. Кроме того, в разделе реализации могут быть свои собственные дополнительные объявления, недоступные программам, использующим этот модуль. Программы не могут обращаться и ссылаться на них. Однако эти недоступные элементы могут использоваться (и, как правило, это делается) видимыми процедурами и функциями, заголовки которых появляются в разделе интерфейса.

    Предложение uses может появляться в разделе implementation. В этом случае uses следует непосредственно за ключевым словом implementation.

    Если процедуры были объявлены как внешние, то в исходном файле должна быть директива {$L имя файла} в любом месте до конца модуля.

    Обычные процедуры и функции, объявленные в разделе интерфейса - которые не являются встроенными - должны появляться в разделе реализации. Заголовок procedure (function) в разделе реализации должен быть такой же, как и в разделе интерфейса, или же иметь короткую форму. В краткой форме за ключевым словом (procedure или function) следует имя процедуры или функции. Подпрограмма содержит свои собственные локальные объявления (метки, константы, типы, переменные, процедуры и функции). За ними следует тело главной программы. Например, в разделе интерфейса объявлены:
...
interface
...
procedure ISwap (var I, J: integer);
function IMax (I, J:integer): integer;
...
Тогда раздел реализации может быть таким:
procedure ISwap;
var Temp : integer;
begin
Temp := I; I := J; J := Temp;
end; {процедуры ISwap}
function IMax (I, J:integer): integer;
begin
if I > J then IMax := I
else IMax := J;
end; {функции IMax}

   Подпрограммы раздела реализации (неописанные в секции интерфейса), должны иметь полный заголовок procedure/funсtion.

   3.4. Раздел инициализации.

   Раздел реализации модуля заключен между словами implementation и end. Но если присутствует слово begin перед end, и операторы между этими словами, то получившийся составной оператор, похожий на тело главной программы, становится разделом инициализации модуля.

    В разделе инициализации инициализируются структуры данных (переменных), используемые модулем или доступные программам, использующим этот модуль. Вы можете использовать этот раздел для открытия файлов. Например, стандартный модуль Printer использует этот раздел для открытия на вывод текстового файла Lst. Файл Lst впоследствии можно использовать в программах, в операторах Write или Writeln.

    При выполнении программы, использующей некоторый модуль, раздел инициализации вызывается перед выполнением тела главной программы. Если в программе используется несколько модулей, раздел инициализации каждого модуля вызывается (в порядке, указанном в операторе uses программы) до выполнения тела главной программы.

    Рассмотрим простейший пример модуля. Чтобы избежать многократного описания в различных программах некоторых общеупотребительных типов данных, можно сосредоточить их в одном модуле. Например, описания, связанные с датами, месяцами, днями и т.д.
unit Calendar;
interface
type
Days = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
WorkDays = Mon..Fri;
Months = (Jan, Feb, Mar, Apr, May, June, July, Aug, Sept, Oct, Nov, Decem);
Spring = Mar..May;
Summer = June..Aug;
Autumn = Sep..Nov;
Winter = Decem..Feb;
DayNo = 1..31;
YearNo = 1900..2000;
Date = record
Day : DayNo;
Month : Months;
Year : YearNo;
end;
implementation
end.

   Данный модуль не содержит разделов реализации и инициализации.

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

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

   В качестве примера разберем построение модуля, предназначенного для построения рамки (для вывода информации в текстовом режиме):
[Unit Servis]

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

    Если необходимо, например, расширить модуль Servis введением новых процедур или изменить реализацию какой-либо процедуры, то если интерфейс модуля при этом останется неизменным, такая модификация никак не отразится на использующих программах.

   3.5. Компиляция и использование модулей.

   Модуль компилируется таким же образом, как и обычные подпрограммы; возможна компиляция из интегрированной среды или с помощью командной строки. Но так как модуль не является непосредственно выполняемой единицей, то в результате его компиляции образуется файл с расширением .TPU (Turbo Pascal Unit), при этом имя файла (с расширением .TPU) должно совпадать с именем файла с исходным текстом модуля.

   С помощью режима Compile главного меню системы Турбо Паскаль откомпилируем текст Servis. Для этого в меню Compile установим опцию Destination Disk (вместо Destination Memory) и откомпилируем с помощью опции Compile. На диске создается файл SERVIS.TPU. После выполнения компиляции и создания файла SERVIS.TPU на диске элементы (процедуры и функции) библиотечного модуля Servis доступны для использования без каких-либо дополнительных описаний.

    Для того, чтобы получить доступ к интерфейсным объектам модуля, необходимо указать в программе имя нужного TPU-файла. Соответствующая конструкция называется спецификацией используемых модулей и имеет следующий вид: uses U1, U2, U3; где uses - служебное слово, U1, U2, U3 - идентификаторы используемых модулей. Эта специфика должна идти непосредственно после заголовка программы; если некоторый модуль использует объекты другого модуля, то такая спецификация должна следовать сразу после служебного слова interface.

    Например, чтобы вызвать модуль Servis нужно записать следующую строку в программе: uses Servis;.

Пример, иллюстрирующий использование модуля Servis:
program DemoServis;
uses CRT, Servis;
Begin
ClrScr;
Frame(10, 10, 50, 15, 1, 15, 1);
Title(10, 10, 50, 15, 10, 15, 'Сведения об учащихся');
Foot(10, 10, 50, 15, 15, 10, 'Для выхода нажмите ESC');
ReadLn
End.

   Пользователь постепенно может расширять список процедур в библиотеке своими, более совершенными средствами. Рассмотрим пример модуля, позволяющего подключить к работе программы манипулятор "мышь".
[unit Mouse]

   Для проверки работоспособности модуля запустим программу MouseDemo, текст которой приводится ниже:
program MouseDemo;
uses CRT, Mouse;
var X, Y, bn, nb: word;
Begin
ClrScr; TextColor(Red);
if MouseInit(nb) then
begin
MouseShow;
repeat
MouseRead(X, Y, bn);
if bn and 1 <> 0 then
begin { Нажата левая клавиша }
X := X div Bn + 1; Y := Y div Bn + 1;
GoToXY(X, Y); Write('*');
end;
{ Выход при нажатой правой клавише }
until bn and 2 <> 0
end;
End.

[НАЗАД]  [ДАЛЕЕ]


Главная
Новости
TurboPascal
Учебное пособие
Лекции
Исходники
Математика
Книги
Лекции
Шпоры
ЦТ и ЕГЭ
Физика

Книги

Шпоры
ЦТ и ЕГЭ

Литература

Сочинения

Краткие содержания

Другое
Мой родной край
Фотогалерея
Форум
Ссылки

Гостевая






 

                                        © Copyright(c) 2004 Amro Group. All rights reserved

 

Hosted by uCoz