Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Всё_о_Паскале.doc
Скачиваний:
7
Добавлен:
20.11.2018
Размер:
4.54 Mб
Скачать

8. Директивы компилятора и обработка ошибок ввода

Компилятор Паскаля – сложное приложение, имеющее множество настроек. При написании учебных программ большинство этих настроек не имеют значения, но некоторые из них окажутся нам полезны. Для управления компилятором существует 2 основных возможности: настройка режимов работы с помощью верхнего меню Options оболочки Turbo Pascal и настройка конкретной программы с помощью директив компилятора, которую мы кратко рассмотрим. В общем виде директива компилятора представляет собой конструкцию вида {$X+} или {$X-}, где X – латинская буква. Вариант со знаком "+" включает некоторый режим работы компилятора (например, строгий контроль программой соответствия типов данных, вывод системных диагностических сообщений и т.д.), а вариант со знаком "-" выключает его. Расположение директив, в общем, произвольно, однако, директивы, влияющие на всю программу, принято располагать в самом начале файла с исходным текстом. Фигурные скобки комментария { … } необходимы, чтобы скрыть действие директив от старых версий компилятора, которые не умели их распознавать.

Подробную информацию о назначении всех директив можно получить в справочной системе оболочки. Основные директивы компилятора также кратко описаны в Приложении 2.

Наиболее полезной для нас выглядит директива {$I-}/{$I+}, соответственно, выключающая и включающая автоматический контроль программой результатов операций ввода/вывода (в/в). К операциям в/в относятся, в числе прочего, ввод данных пользователем, вывод строки на принтер, открытие файла для получения или вывода данных и т.п. Понятно, что даже несложная учебная программа выглядит лучше, если она умеет реагировать на неправильные действия пользователя или возникающие ошибки не просто выводом маловразумительного системного сообщения на английском языке, а доступным неискушенному пользователю текстом. По умолчанию контроль в/в включен и системные сообщения об ошибках генерируются автоматически. Все они кратко приведены в Приложении 3. Для замены системной диагностики своей собственной следует, во-первых, отключить директиву контроля оператором {$I-}, а во-вторых, сразу же после оператора, который мог породить ошибку, проверить значение, возвращаемое системной функцией IoResult. Эта функция возвращает ноль, если последняя операция в/в прошла успешно, в противном случае возвращается ненулевое значение. После завершения "критического" оператора директиву следует включить снова, чтобы не создавать потенциально опасных ситуаций в коде, который будет писаться далее! Приведем один пример, написав "расширенную" программу решения квадратного уравнения, корректно реагирующую на возникающие ошибки:

uses printer;

var a,b,c,d,x1,x2:real;

begin

writeln;

writeln ('Введите 3 вещественных числа:');

{$I-} read (a,b,c); {$I+}

if IoResult<>0 then begin {Возникла ошибка!}

Writeln ('Вы не ввели 3 числа, это что-то другое!');

Reset (input); {очищаем буфер клавиатуры перед ожиданием

нажатия Enter}

Readln;

Halt; {а этим оператором можно аварийно завершить программу!}

end;

d:=sqr(b)-4*a*c;

if d<0 then begin

Writeln ('Ошибка при вычислении корней - дискриминант<0');

Reset (input);

Readln;

Halt;

end;

x1:=(-b+sqrt(d))/(2*a);

x2:=(-b-sqrt(d))/(2*a);

{$I-}

writeln (lst,'x1=',x1:8:2,' x2=',x2:8:2);

{$I+}

if IoResult<>0 then Writeln ('Не удалось вывести на принтер')

else Writeln ('Результаты напечатаны');

Reset (input); {Перед Readln очистили стандартный поток ввода}

Readln;

Halt;

end.

Специальной директивы для контроля математических ошибок в Паскале не предусмотрено, но это почти всегда можно сделать обычными проверками корректности данных. Обратите внимание на альтернативное решение проблемы "двух readln" в этом коде, а также на новый оператор Halt и способ контроля того, удалось ли вывести строку на принтер.

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

Для работы с вещественными числами с двойной точностью (тип double) может также понадобиться указать перед программой директиву {$N+}, позволяющую сгенерировать код для аппаратной обработки таких чисел.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]