Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / 10.модули.doc
Скачиваний:
34
Добавлен:
26.03.2016
Размер:
91.14 Кб
Скачать

ЛЕКЦИЯ 10

Модули.

Модульность программ

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

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

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

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

Стандартные модули языка Pascal

Перечислим самые распространенные модули, входящие в состав стандартных библиотек языка Pascal. Подробное описание этих библиотек можно найти в любом справочном издании.

System

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

Напомним, что этот модуль содержит следующие типы подпрограмм:

  1. подпрограммы для обработки величин порядковых типов данных (dec, inc, odd, pred, succ);

  2. арифметические функции;

  3. функции преобразования типов данных (chr, ord, round, trunc);

  4. процедуры управления процессом выполнения программы (break, continue, exit, halt);

  5. подпрограммы обработки строк (concat, copy, delete, insert, length, pos, str, val);

  6. подпрограммы файлового ввода и вывода;

  7. подпрограммы динамического распределения памяти (dispose, freemem, getmem, new);

  8. функции для работы с указателями и адресами (addr);

  9. а также некоторые другие подпрограммы (например, exclude, include, random, randomize, upcase).

Crt

Модуль Crt служит для организации "хорошего" вывода на экран. Подробнее о содержимом этого модуля мы расскажем далее.

Wincrt

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

Printer

Модуль Printer позволяет производить вывод информации не на консоль, а на принтер (под операционной системой DOS).

Winprn

Модуль WinPrn является аналогом модуля Printer для операционной системы Windows.

Dos

Модуль Dos позволяет обмениваться информацией с операционной системой. Системное время, прерывания, состояния параметров окружения, процедуры обработки процессов, работа с дисковым пространством - всем этим занимается модуль Dos.

Windos

Модуль WinDos является аналогом модуля Dos для операционной системы Windows.

Strings

Модуль Strings позволяет перейти от стандартных строк языка Pascal к строкам, ограниченным нулем. В отличие от обычных строк, чья длина не может превышать 255 символов, эти строки могут состоять из 65 535 символов, причем конец каждой такой строки помечен символом #0.

Graph

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

Overlay

Модуль Overlay предоставляет возможность делать большие программы оверлейными (многократно использующими одну и ту же область памяти).

Winapi

Модуль WinApi отвечает за создание динамических библиотек. Этот модуль свойственен лишь поздним версиям языка Pascal (например, Turbo Pascal 7.0).

Подключение модулей

Для того чтобы подключить к программе какой-либо модуль, необходимо сразу после заголовка программы поместить следующую строку:

uses <имя_модуля>;

Если подключаемых модулей несколько, эта строка примет вид:

uses <имя_модуля_1>,...,<имя_модуля_N>;

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

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

Например, вы можете пользоваться функцией abs(), не объявляя и не описывая ее, поскольку эта функция включена в состав стандартного модуля System, автоматически подключаемого к любой программе на языке Pascal. Если же вы захотите очистить экран монитора перед выдачей результатов, вам придется подключить к вашей программе модуль crt и воспользоваться содержащейся в нем процедурой clrscr.

Создание модульной программы

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

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

unit <имя_модуля>;

interface {секция внешних связей}

implementation {секция реализаций}

begin {секция инициализации}

end.

Разберем каждую из этих секций отдельно.

Название

В отличие от заголовка программы (program <имя_программы>;), который может и отсутствовать, заголовок модуля (unit <имя_модуля>;) обязан присутствовать всегда.

Кроме того, очень полезно давать модулям и содержащим их файлам одинаковые имена. Иначе говоря, модуль с именем modul_1 желательно разместить в файле с именем modul_1.pas, и т.п.

Секция внешних связей

Эта секция содержит объявления тех типов данных, констант, переменных, подпрограмм и т.п., которые должны быть видны вне модуля.

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

interface

[uses <список_вспомогательных_модулей>;]

[const <список_внешних_констант>;]

[type <список_внешних_типов_данных>;]

[var <список_внешних_переменных>;]

[procedure <объявление_внешней_процедуры>;]

[function <объявление_внешней_функции>;]

Например, пусть у нас есть два модуля: mod_const, содержащий описания базовых констант и типов данных, и mod1, использующий эти описания ( приводим только секции внешних связей):

unit mod_const;

interface

const sto = 100;

type one_to_sto = 1..sto;

...

unit mod1;

interface

uses mod_const;

const dvesti = 2*sto;

type massiv = array[1..dvesti] of byte;

var a: massiv;

b: one_to_sto;

function min(x,y:one_to_sto):one_to_sto;

...

Теперь, если в каком-либо третьем модуле встретится строка

uses mod1;

то внутри этого третьего модуля можно будет использовать (без дополнительных объявлений) тип massiv, переменные a и b, а также функцию min. Необходимо отметить, что использовать константу sto третий модуль не сможет, поскольку в нем не было указано

uses mod_const;

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

<имя_модуля>.<идентификатор>

Если имя модуля не указано, то идентификатор считается принадлежащим текущему модулю. И только если в текущем модуле этот идентификатор не был объявлен, то начинается поиск в подключенных модулях.

Рисунок 13.1 - Пример структуры модульной программы

Например, если модульная программа имеет структуру, изображенную на рисунке 13.1, то таблица доступности переменных будет выглядеть так:

Связи

Способ обращения к одноименным переменным

program prg;

uses A,B,C;

p

a.p

b.p

c.p

не видна

не видна

unit A;

uses C,D,F;

не видна

p

не видна

c.p

d.p

f.p

unit B;

uses F;

не видна

не видна

p

не видна

не видна

f.p

unit C;

-

не видна

не видна

не видна

p

не видна

не видна

unit D;

-

не видна

не видна

не видна

не видна

p

не видна

unit F;

-

не видна

не видна

не видна

не видна

не видна

p

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

unit mod_1;

interface

uses mod_2;

...

unit mod_2;

interface

uses mod_1;

...