Чтение онлайн

на главную

Жанры

Шрифт:

Рассмотрим способ безаварийного определения наличия файла на диске (здесь имя файла содержится в переменной FileName).

Assign(F, FileName); Reset(F);

if IOResult=0

then Writeln (’Нашелся файл ’+ FileName)

else Writeln (’Файл ’+FileName+’ не обнаружен!’);

Этот фрагмент надёжно сработает только при отключенном флажке «I/O checking», иначе программа может прерваться аварийно. Стало быть, перед компиляцией надо проверять состояние флажка, а это хлопотно и ненадежно.

В

настройках опций компилятора через меню есть и другой изъян. Как быть, когда в разных местах программы требуется по-разному реагировать на ошибки: где-то включить этот контроль, а где-то нет? Но флажок действует на всю программу в целом, глобально, – он не допускает выборочной настройки. Что делать?

Директивы компилятора

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

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

{ $I+ - включить контроль ввода-вывода }

{ $I- - отключить контроль ввода-вывода }

В один комментарий можно вместить несколько директив. Перечень директив вы найдете в справке по компилятору и в приложении Ж.

Директиву – в студию!

Сейчас мы извлечем первую пользу из директив: сотворим функцию, определяющую наличие файла на диске. Применим для этого директиву $I. Наша булева функция будет возвращать TRUE, если файл, имя которого передано в параметре, существует. Вот её текст, а заодно и фрагмент тестирующей программы.

{ P_27_1 – определение наличия заданного файла }

function FileExists(const aName: string): boolean;

var F: text;

begin

FileExists:= false; { предполагаем, что файла нет }

Assign(F, aName);

{$I-} Reset(F); {$I+} { контроль отключен на время Reset }

if IOResult=0 then begin { если файл существует }

Close(F); { закрываем файл }

FileExists:= true;

end;

end;

begin {--- главная программа ---}

Writeln( FileExists('AUTO.BAT') ); { печатает false }

Writeln( FileExists('C:\AUTOEXEC.BAT') ); {

печатает true }

end.

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

Как сработает наша функция? После попытки открыть файл вызовем функцию IOResult. Если она вернула ноль, значит, файл существует, и его надо закрыть, поскольку никаких действий с ним внутри функции FileExists не намечается. Проверьте работу этой полезной функции, она ещё пригодится вам!

Парад директив

Разбогатев со временем собственными программами, вам, вероятно, захочется поделиться ими. При передаче исходных текстов важно передать и настройки опций компилятора, иначе EXE–файл может быть построен неправильно. Эти настройки лучше передать путём вставки директив компилятора прямо в программу. Но директив много, – запомнить их трудно, а ошибиться легко. Впрочем, есть один волшебный способ…

Откройте опции компилятора (рис. 61) и настройте в нём флажки так, как нужно, не забыв сохранить их кнопкой ОК. Затем откройте файл с программой и нажмите волшебную комбинацию клавиш Ctrl+O+O. То есть, удерживая клавишу CTRL, дважды нажмите латинскую букву «O». И – о, чудо! – в начале программы появятся строчки с настройками всех директив, например, такие.

{$IFDEF NORMAL}

{$H-,I+,OBJECTCHECKS-,Q-,R-,S-}

{$ENDIF NORMAL}

{$IFDEF DEBUG}

{$H-,I+,OBJECTCHECKS-,Q+,R+,S-}

{$ENDIF DEBUG}

{$IFDEF RELEASE}

{$H-,I-,OBJECTCHECKS-,Q-,R-,S-}

{$ENDIF RELEASE}

Здесь представлены настройки директив для трех вариантов компиляции. Эти варианты (Normal/Debug/Release) выбираются в пункте меню Options –> Mode…. Знаки «+» и «–» соответствуют состоянию флажков в окне опций. Директивы вида $IFDEF нужны для выбора одного из вариантов компиляции (об условных директивах я расскажу в главе 60). Можно упростить эту конструкцию, оставив, лишь одну строку.

{$H–, I+, OBJECTCHECKS–, Q–, R–, S–}

Потребовалось изменить настройки? Пожалуйста! – Удалите эти строчки и повторите «волшебные заклинания». Или расставьте плюсы и минусы вручную.

Итоги

• Программист допускает два рода ошибок: синтаксические и семантические (смысловые).

• Синтаксические ошибки обнаруживает компилятор. Пока вы не исправите все такие ошибки, исполняемый файл не сформируется.

Поделиться:
Популярные книги

Измена. За что ты так со мной

Дали Мила
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. За что ты так со мной

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Большие дела

Ромов Дмитрий
7. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Большие дела

Эксклюзив

Юнина Наталья
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Эксклюзив

И только смерть разлучит нас

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
И только смерть разлучит нас

Черкес. Дебют двойного агента в Стамбуле

Greko
1. Черкес
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черкес. Дебют двойного агента в Стамбуле

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Третье правило дворянина

Герда Александр
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Третье правило дворянина

Ваантан

Кораблев Родион
10. Другая сторона
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Ваантан

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2