Автор работы: Пользователь скрыл имя, 16 Сентября 2009 в 13:41, Не определен
Учебник по программированию
Структура модуля.
Модуль обеспечивает набор средств, благодаря возможности испольозвания процедур и функций, поддерживающих константы, типы данных и переменных, но их действительная реализация скрыта из-за того, что модуль разделен на два раздела: интерфейс и реализация.
Все объявления и описания модуля становятся доступными
программе, использующей его.
Структура модуля похожа на структуру программы, но имеет и
отличия:
unit <идентификатор>;
interface
uses <список модулей>;
{общие объявления}
implementation
uses <список модулей>;
{личные объявления}
{реализация процедур и функций}
begin
{код инициализации}
end.
Заголовок модуля - слово unit, за которым следует имя модуля - идентификатор.
Следующий элемент - ключевое слово interface. Это слово обозначает начало раздела интерфейса модуля, доступного для всех других модулей и программ, использующих этот модуль.
В
предложении uses указываются модули,
которые может использовать этот модуль.
Слово uses может появляться в двух местах:
- сразу же после слова interface; в этом случае, константы или типы данных, объявленные в интерфейсах этих модулей, могут быть использованы в любых объявлениях.
-
сразу же
после слова implementation; в
этом случае, любые объявления этого
модуля могут использоваться только
внутри раздела реализации. Это
так же допускает циклические
ссылки модулей; мы покажем как их использовать
ниже.
Раздел
интерфейса.
Это "открытая" часть модуля, она начинается ключевым словом interface, следующим сразу за заголовком, и ограничена ключевым словом imрlеmentation.
Интерфейс определяет, что является видимым (доступным) для некоторой программы (или других модулей), использующих этот модуль.
Любая программа, использующая этот модуль, имеет доступ к этим видимым элементам.
В интерфейсе модуля можно объявить константы, типы данных,
переменные, процедуры и функции. Как и в программе, они могут быть
расположены в
любом порядке, т.е разделы могут
встречаться повторно
(type...var...<proc>...type...
Процедуры и функции, доступные для программы, использующей
этот модуль
описываются в разделе
тела - операторы, реализующие их, - в разделе реализации.
Объявление forward не разрешается.
Тела
всех обычных процедур и функций
находятся в разделе реализации
после раздела интерфейса, в котором
перечислены их имена и заголовки.
uses может появиться и в разделе
implementation. Если в разделе реализации
имеет место uses, то это слово следует сразу
же за словом implementation.
Секция реализации.
Раздел реализации - закрытая, недоступная часть - начинается со слова implementation. Все, что объявлено в части интерфейса видимо для раздела реализации: константы, типы, переменные, процедуры и функции. Кроме того, в разделе реализации могут быть свои собственные дополнительные объявления, недоступные программам, использующим этот модуль.
Программы не могут обращаться и ссылаться на них. Однако эти недоступные элементы могут использоваться (и, как правило, это делается) видимыми процедурами и функциями, заголовки которых появляются в разделе интерфейса.
Предложение uses может появляться в разделе implementation. В
этом случае uses следует непосредственно за ключевым словом
implementation.
Если процедуры были объявлены как внешние, то в исходном файле
должна быть директива {$L имя файла} в любом месте до конца модуля
end. Обычные процедуры и функции, объявленные в разделе интерфейса
- которые не являются встроенными - должны появляться в разделе
реализации.
Заголовок
procedure (function) в разделе реализации
должен быть такой же, как
и в разделе интерфейса, или
же иметь короткую форму. В краткой
форме за ключевым словом (procedure
или function) следует идентификатор (имя).
Подпрограмма содержит свои собственные
локальные объявления (метки,
константы, типы, переменые,
процедуры и фукции). За ними
следует тело главной программы.
Например,
в разделе интерфейса объявлены:
procedure ISwap (var v1,v2: integer);
function IMax
(v1,V2:integer);
Раздел
реализации может быть:
procedure ISwap;
var
Temp : integer;
begin
Temp := V1;V1:= V2;V2 := Temp;
end; {процедуры
ISwap}
function IMax (v1,v2:integer):integer;
begin
if V1 > V2 then
IMax := V1
else IMax := V2
end; {функции
IMax}
Подпрограммы
раздела реализации (неописанные
в секции интерфейса), должны иметь
полный заголовок procedure/funсtion.
Раздел инициализации.
Раздел реализации модуля заключен между словами implementation и end. Но если присутствует слово begin перед end, и операторы между этими словами, то получившийся составной оператор, похожий на тело главной программы, становится разделом инициализации модуля.
В разделе инициализации инициализируются структуры данных (переменных), используемые модулем или доступные программам, использующим этот модуль. Вы можете использовать этот раздел для открытия файлов. Например, стандартный модуль Printer использует этот раздел для открытия на вывод текстового файла Lst. Файл Lst впоследствии можно использовать в программах, в операторах Write или Writeln.
При выполнении
программы, использующей некоторый
модуль, раздел инициализации вызывается
перед выполнением тела главной
программы. Если в программе используется
несколько модулей, раздел инициализации
каждого модуля вызывается (в
порядке, указанном в операторе uses
программы) до выполнения тела главной
программы.
Как используются модули?
и хранятся в специальном машинном коде; это не файлы типа Include.
Даже раздел интерфейса хранится в специальном двоичном формате, который использует Turbo Pascal. Более того, стандартные модули хранятся в специальном файле TURBO.TPL и автоматически загружаются в память с Turbo Pascal.
В результате подключения модулей к программе увеличивается
время и компиляции программы (незначительно, приблизительно на 1 секунду). Если модули загружаются из отдельных дисковых файлов может потребоваться дополнительное время из-за чтения с диска.
Для использования
модулей необходимо, чтобы
в начале присутствовало предложение
uses, за которым следует список
имен всех модулей, разделенных запятыми.
program MyProg;
uses thisUnit,thatUnit,
При компиляции этой информации к таблице символов прибавляется
информации из раздела интерфейса, а из раздела реализации к самой программе машинный код. Порядок описания модулей в предложении uses не имеет большого значения. Если thisUnit использует thatUnit, то можно объявить их в любом порядке. Компилятор сам определит, который из них должен следовать первым.
Иначе
говоря, если thisUnit использует thatUnit,
а программа MyProg не вызывает какие-либо
программы в подпрограмме thatUnit, то можно
"спрятать"подпрограммы в программу
thatUnit, опуская их в операторе
uses:
unit thisUnit
uses thatUnit
...
program MyProg;
uses thisUnit,theotherUnit;
...
В этом примере thisUnit может вызвать подпрограмму thatUnit, а MyProg - подпрограммы thisUnit и thеоtherUnit. MyProg не может вызвать thatUnit, т.к эта подпрограмма не описана в его предложении uses.
Если предложение uses отсутствует, Turbo Pascal подсоединяет стандартный модуль System. Этот модуль обеспечивает выполнение некоторых стандартных подпрограмм Turbo Pascal и программ, специфичных для Turbo Pascal.