русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Директивы компилятора (продолжение)


Дата добавления: 2015-07-09; просмотров: 689; Нарушение авторских прав


Директивы без параметров:

  • {$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 осуществляется из командной строки):

Цитата

BINOBJ EGAVGA.BGI EGAVGA.OBJ EGAVGADriverProc


2. Подключить полученный OBJ файл к программе:

Код

{$L EGAVGA.OBJ}
Procedure EGAVGADriverProc; External;


Сама инициализация графики (например, режима 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.

Присваивание имен константам делает программу более удобной для понимания и внесения исправлений в программу. При изменении констант достаточно будет изменить соответствующие значения в разделе описания констант.



<== предыдущая лекция | следующая лекция ==>
Общая структура программы в языке Паскаль | Целые типы Pascal


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.085 сек.