{$A+} - Выравнивание данных. (Глобальная директива). Эта директива позволяет переключаться между выравниванием переменных и типизированных констант по границе слова (состояние {А+}) и по границе байта (состояние {A-}). При выравнивании на границу слова адресация происходит за 1 цикл обращения к памяти вместо двух.
{$Е+} - Эмуляция математического сопроцессора. (Глобальная директива). Разрешает ({$E+}) или запрещает ({$E-}) компоновку с библиотекой, которая будет эмулировать работу сопроцессора в случае его отсутствия. При компиляции в режиме {$N+, E+} Паскаль выполняет компоновку с полным эмулятором сопроцессора. Полученный EXE файл может выполняться на любой машине независимо от присутствия сопроцессора. В состоянии {$N+, E-} компоновка осуществляется с гораздо меньшей по размеру библиотекой, которая может использоваться только при наличии сопроцессора. (Эта директива не производит никаких действий при использовании ее в модуле. Она действует только при компоновке программы)
{$F-} - Выбор модели вызова (Far/Near). (Локальная директива). Управляет выбором типа вызова компилируемых процедур и функций.
В процессоре поддерживается два типа вызовов и инструкций возврата управления - ближние (NEAR) и дальние (FAR). Ближние вызовы передают управление другой ячейке в пределах того же программного сегмента, а дальние вызовы позволяют перейти в другой программный сегмент.
Инструкция ближнего обращения CALL помещает в стек 16-битовый адрес возврата (только смещение), а инструкция дальнего вызова помещает в стек 32-битовый адрес возврата (адрес сегмента и смещение). Соответствующая инструкция RET извлекает из стека только смещение или адрес сегмента и смещение.
При компиляции в режиме {$F+} все процедуры и функции всегда используют дальнюю модель вызова (Far Call). При указании директивы {$F-} компилятор Паскаля автоматически выбирает необходимый тип обращений: дальний, если процедура или функция описывается в интерфейсном разделе модуля (с расчетом на вызов из других блоков), и ближний в случае описания в разделе Implementation. Существует несколько случаев, когда требуется использовать директиву {$F+}. Например, при использовании оверлейных модулей и при передаче процедур/функций в качестве параметров они должны быть откомпилированы с расчетом на дальнюю модель вызова.
{$I+} - Режим контроля ввода/вывода. (Локальная директива). Этот ключ задает ({$I+}) или отменяет ({$I-}) генерацию кода, проверяющего результат выполнения операций ввода/вывода. Если операция ввода/вывода не может завершиться корректно и включен режим {$I+}, происходит ошибка времени выполнения (Run-time Error). При отключенном контроле (режим {$I-}) аварийного останова программы не происходит, и результат операции может быть проанализирован с помощью функции IOResult. Внимание: после первого обращения к IOResult, флаг ошибки сбрасывается, и проанализировать ошибку во второй раз не получится... Чтобы это сделать, нужно сохранить значение IOResult в какой-либо переменной, и проверять именно значение этой переменной !!!
{$N-} - Использование сопроцессора. (Глобальная директива). При указании режима {$N-} генерируется код для программного выполнения всех вещественных вычислений. При режиме {$N+} генерируется код для выполнения таких вычислений аппаратно с помощью сопроцессора.
{$R-} - Режим проверки границ. (Локальная директива). Приводит в действие ({$R+}) или отменяет ({$R-}) генерирование кода проверки границ. При указании {$R+} все выражения со строками и массивы проверяются на нахождение индекса в допустимых пределах (все операторы присваивания переменным скалярных типов проверяются на принадлежность границам типа). При нарушении диапазона происходит ошибка времени исполнения. Эта директива увеличивает размер программы и уменьшает скорость ее исполнения. Поэтому желательно использовать режим {$R+} при отладке, выключая его в окончательной версии.
{$S+} - Режим проверки переполнения стека. (Локальная директива). Приводит в действие ({$S+}) или отменяет ({$S-}) генерирование кода проверки границ. При указании {$S+} генерируется код, проверяющий, достаточно ли места в стеке выделено для локальных переменных. При недостатке места в стеке происходит ошибка времени исполнения. В режиме {$S-} наиболее вероятно произойдет "зависание" системы.
{$V+} - Режим проверки параметров строкового типа. (Локальная директива). В состоянии {$V+} выполняется строгая проверка типа, прикоторой требуется, чтобы формальный и фактический параметр имели иденимчные строковые типы. В состоянии {$V-} ф качастве фактического параметра допускается использовать любую переменную строкового типа, даже если ее описанная длинна не совпадает с длиной соответствующего формального параметра.
Директивы с параметрами:
{$L имя_файла} - Компоновка файла объектных кодов. Данная директива предписывает компилятору скомпоновать указанный файл с компилируемой программой или модулем. Директива {$L имя_файла} используется для компоновки кода, написанного на ассемблере.
Кроме линковки с OBJ файлами данная директива очень часто используется для включения BGI драйверов и шрифтов в EXE файл (для полностью автономной работы программы). Для того чтобы произвести эту операцию нужно сделать следующее:
1. С помощью утилиты BINOBJ.EXE (входящей в дистрибутив Турбо Паскаля) преобразовать BGI файл в OBJ-формат (работа с утилитой BINOBJ осуществляется из командной строки):
Сама инициализация графики (например, режима VGA) будет осуществляться так:
Код
... Var grDriver, grMode, ErrCode : Integer; ... Begin If RegisterBGIDriver(@EGAVGADriverProc) < 0 Then Begin WriteLn('Error registering driver : ', GraphErrorMsg(GraphResult)); Halt(100) End;
grDriver := VGA; grMode := VGAHi; InitGraph(grDriver, grMode, ''); ErrCode := GraphResult; If ErrCode <> grOk Then Begin WriteLn('Graphics error : ', GraphErrorMsg(ErrCode)); Halt(100) End; ... End.
После этого можно не заботиться о наличии в текущей директории соответствующего BGI драйвера.
8. Раздел описания констант
Константа - это величина, которая не изменяет своего значения в процессе выполнения программы. С константами мы с Вами уже встречались, так как в общем случае константой является любое целое или вещественное число, символ, идентификаторы false и true, а также идентификаторы, обозначающие значения переменных перечисляемого типа. Но константа может быть обозначена и именем. В этом случае она должна быть описана в разделе описания констант. Раздел описания констант начинается словом Const от англ. constancy - постоянство).
Например,
Const N = 25; K = 38; D = (N + K) Div 2; Letter = 'f'; M = 5E15
Здесь n, k, d - это целочисленные, letter - константа символьного типа, а m - константа вещественного типа. Следует заметить, что константа d принимает свое значение после вычисления выражения. В разделе констант можно использовать лишь некоторые стандартные функции, такие, как Abs, Chr, Pred, Succ, Odd, Ord.
Присваивание имен константам делает программу более удобной для понимания и внесения исправлений в программу. При изменении констант достаточно будет изменить соответствующие значения в разделе описания констант.