Выбрать главу

| VAR результатов расчетов

| Определения процедур и функций

| построения графиков

| LABEL Метки, константы и переменные,

| CONST используемые только в основном

| VAR блоке программы

| BEGIN

| Основной блок программы

| END.

Рис. 3.2

ней вводится, должно быть объявлено, до того как будет использовано. Так, переменные из самого нижнего блока VAR (см. рис. 3.2) будут недоступны в определяемых выше процедурах. Попытка использовать их в процедурах вызовет ошибку и остановку компиляции. Исправить такую ошибку просто: надо перенести нужные переменные в блок VAR перед процедурами.

Компилятор Турбо Паскаля накладывает некоторые ограничения на текст программ. Так, длина строки не может превысить 126 символов, а объем файла программы (текста) — 64K (максимально).

3.3. Комментарии и ключи компиляции

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

{ текст комментария }

или в круглые скобки со знаком умножения (звездочкой):

(* текст комментария *)

- 55 -

между скобками и звездочкой не должно быть пробелов. Комментарии не могут пересекать друг друга:

{ пример пересечения (* комментариев } — так нельзя *),

но могут быть вложенными. При этом внешний и внутренний комментарии должны быть заключены в разные скобки:

(* внешний охватывает { внутренний } комментарий *)

Длина комментария не ограничивается одной строкой. Можно, например, закомментировать целый кусок текста:

{

много

строк

комментариев

}

Турбо Паскаль позволяет программе (тексту) управлять режимом компиляции: включать или выключать контроль ошибок, использовать или эмулировать математический сопроцессор, изменять распределение памяти и др. Для изменения режима используются ключи компиляции: специальные комментарии, содержащие символ «$» и букву-ключ с последующим знаком «+» (включить режим) или «-» (выключить). Например:

{$R-} отключить проверку диапазонов индексов массивов;

{$N+} использовать сопроцессор 80Х87 и т.д.

Список ключей компиляции приведен в Приложении 2. Можно объединять ключи в один комментарий:

{$N+,R-}

Открывающие скобки, символ «$» и ключ должны быть написаны без пробелов между ними. Подобные конструкции можно вставлять в программу, и при компиляции она сама будет задавать режим работы компилятора. Ключи подразделяются на глобальные (раз установленный режим уже не может измениться) или локальные (можно изменять режимы для разных частей программы). Глобальные ключи должны стоять в начале программы, а локальные — где угодно программисту. Стартовые значения ключей (значения по умолчанию) задаются в среде программирования посредством меню Options/Compiler.

Некоторые ключи задают не режим, а компоновку программы из внешних составных частей. Таков, например, ключ

{$I ИмяФайлаВключения}

- 56 -

называемый командой включения в программу внешнего текстового файла. Обратите внимание на отсутствие знаков «+» или «-». Вместо них стоит пробел и имя файла. Эта команда заставляет компилятор считать заданный внешний файл частью обрабатываемой программы, т.е. отлаженные законченные блоки текста могут быть записаны на диск и заменены в программе на команды их включения. Это немного замедляет процесс компиляции, но может сэкономить массу места в программе, так как последняя превращается в «цепочку» различных файлов на диске. Примеры задания включения файлов-блоков:

{$I incproc.pas}, или, что то же самое,

{$I incproc},

{$I c:\pascal\pas\graf.inc},

{$I ..\USER\Block1.blk}

Текст включаемого блока должен удовлетворять двум условиям: будучи подставленным на место соответствующей команды {$I...}, он обязан вписаться в структуру и смысл программы без ошибок и должен содержать законченный смысловой фрагмент. Последнее означает, что блок от BEGIN до END (например, тело процедуры) должен храниться целиком в одном файле.

Включаемые тексты сами могут содержать команды {$I...}, вставляющие как бы уже дважды вложенные тексты, а те, в свою очередь, тоже могут содержать директивы {$I...}. Максимальный уровень подобной вложенности равен восьми.

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

{$L code.obj}

или, что то же самое,

{$L code} {$L c:\pascal\obj\grafproc.obj}

Обычно после директивы {$L...} в тексте программы сразу ставятся описания внешних процедур и функций, реализованных в подключенном коде.

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

- 57 -

{$O ИмяОверлейногоМодуляНаДиске}

Подробную информацию об оверлейных структурах смотрите в гл. 18 «Модуль Overlay».

3.4. Условная компиляция программ

Принципы условной компиляции тесно связаны с построением программ на Турбо Паскале. Разрешая группировать блоки VAR, TYPE и прочие по функциональным признакам и размещать их в различных местах программы, Турбо Паскаль предоставляет еще и средства управления порядком компиляции (не путать с режимами!). Любой, кто отлаживал свои программы, знает, как исключить из работы фрагмент текста: надо оформить его как комментарий или обойти оператором перехода типа GOTO. Но все это нарушает исходный текст. Турбо Паскаль вводит особый набор ключей компиляции для решения подобных вопросов. Их немного:

{$DEFINE КлючевоеСлово } задание ключевого слова,

{$UNDEF КлючевоеСлово } сброс ключевого слова,

{$IFDEF КлючевоеСлово } проверка задания слова,

{$IFNDEF КлючевоеСлово } проверка отсутствия задания ключевого слова,

{$IFOPT КлючИзнак } проверка режима компиляции,

{$ELSE) альтернативная ветвь,

{$ENDIF) обязательный конец условия.

Ключ $DEFINE определяет (задает) условное ключевое слово, которое становится активным и известным компилятору и по которому будут срабатывать другие ключи: $IFDEF — проверка условия активности этого слова и $IFNDEF — проверка отсутствия его задания (рис. 3.3).

| { $DEFINE variant0 }

| BEGIN

| {$IFDEF variant0 }

| WriteLn ( 'Вариант программы номер 0' );

| {$ENDIF)

| {$IFNDEF variant0 }

| WriteLn ( 'Ненулевая версия программы' );

| {$ENDIF}

| END.

Рис. 3.3

- 58 -

Если в тексте программы определено ключевое слово (здесь variant0), то будет откомпилирован блок, зависящий от активности этого слова, т.е. заключенный между ключами {$IFDEF variant0} и {$ENDIF}. Альтернативный вариант блока будет компилироваться только, когда ключевое слово variant0 неопределено (пассивно). На это указывают обрамляющие его ключи {$IFNDEF variant0}...{$ENDIF}. Но если, например, изменить в тексте ключа $DEFINE слово variant0 на variant1 и заново откомпилировать программу, то все получится наоборот: будет пропущен первый блок (его слово не определено), но откомпилирован второй (условие отсутствия слова выполняется).

Можно заметить, что обязательная директива {$ENDIF} всегда замыкает блок, начатый ключом {$IF...}. Пример на рис. 3.3 можно без ущерба для смысла переписать в ином виде (рис. 3.4).