Программирование на языке Pascal

       

Секция реализации


Этот раздел модуля содержит реализации всех подпрограмм, которые были объявлены в секции внешних связей. Как и в случае косвенной рекурсии (см. лекцию 9), здесь объявление подпрограммы оторвано от ее описания. Однако ключевое слово forward здесь является излишним.

Кроме того, в этой же секции объявляются и описываются внутренние (невидимые вне модуля) метки, константы, типы данных, переменные и подпрограммы.

implementation [uses <список_вспомогательных_модулей>;] [const <список_внутренних_констант>;] [type <список_внутренних_типов_данных>;] [var <список_внутренних_переменных>;] [procedure <описание_внешней_процедуры>;] [function <описание_внешней_функции>;] [procedure <объявление_и_описание_внутренней_процедуры>;] [function <объявление_и_описание_внутренней_функции>;]

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

unit mod_1; interface ... implementation uses mod_2; ...

unit mod_2; interface ... implementation uses mod_1; ...

Хороший пример реальной рекурсии при обращениях к модулям (позаимствованный, правда, из оригинальной документации) дается в книге М.В. Сергиевского и А.В. Шалашова "Турбо Паскаль 7.0. Язык. Среда программирования". Позволим себе привести (с небольшими изменениями) этот пример.

Смысл рекурсии здесь состоит в том, что вывод некоторого сообщения на заданную позицию экрана при помощи процедуры message, содержащейся в модуле mod_1, может сгенерировать ошибку, сообщение о которой (процедура _error из модуля mod_2) снова задействует процедуру message - но уже с другими параметрами.

unit mod_1; interface procedure message(x,y: byte; msg: string); implementation uses mod_2, crt; procedure message; begin if(x in [1..80-length(msg)]and(y in [1..25]) then begin gotoxy(x,y); {позиционирование курсора} write(msg) end else _error('Сообщение не входит в экран') {вызов процедуры из модуля mod_2} end; end.

unit mod_2; interface procedure _error(msg:string);

implementation uses mod_1; procedure _error; begin message(1,25,msg); {вызов процедуры из модуля mod_1} end; end.



Содержание раздела