Ошибки при выполнении программы. Опции компилятора
Ошибки при выполнении программы. Опции компилятора
С.А. Григорьев
Умея пользоваться массивами, условными операторами и
операторами цикла, вы можете писать довольно серьезные программы. При
выполнении этих программ неизбежно будут возникать критические ошибки,
приводящие к аварийному завершению программы. Такие ошибки по английски
называются Run-time errors - ошибки времени выполнения. Рассмотрим пока только
наиболее часто встречающиеся арифметические ошибки:
Division by zero - код ошибки 200;
Arithmetic overflow
- код ошибки 215;
Range check error -
код ошибки 201;
Floating point
overflow - код ошибки 205;
Invalid floating point
operation - код ошибки 207.
Ошибка Division by zero - деление на ноль - возникает
при выполнении операций DIV, MOD и /, когда делитель равен нулю.
Ошибка Arithmetic overflow - целочисленное
переполнение - возникает при выполнении арифметической операции над целыми
числами, когда результат операции выходит за границы соответствующего типа.
Такая ошибка произойдет, например, при выполнении программы
VAR a,b : Word; c : Integer; BEGIN a:=100; b:=200; c:=a-b; END.
Ошибка произошла, когда вычислилось значение выражения
a-b, равное
-100. Мы знаем, что при выполнении операции над
операндами типа Word результат будет иметь тип Word, а -100 не является
допустимым значением этого типа. То обстоятельство, что это значение мы
собирались присвоить переменной типа Integer, не имеет значения, т.к. ошибка
произошла до присваивания. Интересно, что, если описать a и b как Byte, то
ошибки не будет (см. таблицу 2 в главе 5).
Ошибка Range check error - ошибка проверки диапазона -
происходит в двух случаях. Во-первых, при попытке присвоить целочисленной
переменной недопустимое значение, и, во-вторых, при использовании недопустимого
индексного выражения для элемента любого массива. Проиллюстрируем оба эти
случая на простых примерах.
VAR a,b,c : Word; BEGIN a:=$FFFF; b:=1; c:=a+b;
END.
Мы попытались присвоить переменной типа Word значение
65536, которое не является допустимым для этого типа.
VAR x : ARRAY[2..8]
OF Real; i : Byte;
BEGIN FOR i:=8 DOWNTO 1 DO x[i]:=Sqrt(i); END.
Ошибка произошла при обращении к первому элементу
массива, который не существует. Фактически этот второй случай полностью
аналогичен первому - мы попытались "присвоить" индексу массива, тип
которого-2..8, значение 1.
Ошибка Floating point overflow - вещественное
переполнение - возникает при выполнении операции над вещественными числами,
когда результат операции слишком велик, или при попытке присвоить вещественной
переменной слишком большое значение. Когда речь идет о вещественных числах,
термин "слишком большое" следует понимать как большое по абсолютной
величине - знак числа не имеет значения. Приведем пример программы, содержащей
такую ошибку.
VAR r : Real; BEGIN
r:=-1E20; r:=Sqr(r); END.
При возведении в квадрат величины r мы получим слишком
большое для типа Real число 1E40.
Ошибка Invalid floating point operation возникает в
трех случаях:
1) при вычислении корня из отрицательного числа;
2) при вычислении логарифма неположительного числа;
3) при вычислении функций Trunc и Round от слишком
большого (по абсолютной величине) вещественного числа. Эта ошибка довольно
очевидна, и мы не станем ее иллюстрировать.
Как же должен поступать программист, когда при
выполнении его программы возникают ошибки? Прежде всего нужно локализовать
ошибку, то есть найти оператор, в котором она произошла. В этом вам может помочь
среда Turbo Pascal, если в ней правильно установлены опции компилятора. Опции
компилятора позволяют изменять режим компиляции и задаются в подменю Compiler
меню Options
среды Turbo Pascal. Пока нас будут интересовать лишь пять опций: Range checking, Stack
cheking, I/O checking, Overflow checking, Debug information. Если они включены, то настройка среды благоприятна для
отладки вашей программы. Если они выключены, то их обязательно следует
включить, а еще лучше задать их непосредственно в тексте своей программы. Опции
записываются в программе в виде:
{$ буква +
/ - }
Каждой опции соответствует своя буква (эти буквы
выделены в подменю Compiler цветом), символ "+" означает включить, а
символ "-" - выключить. В программе можно задать одну опцию, например,
{$R+} или несколько опций - {$R+,I-,S+} . Некоторые опции можно записывать
только в самом начале программы, другие могут размещаться в любом ее месте.
Опция Range checking (R) отвечает за контроль ошибок
Range check error, Overflow checking (C) - за контроль ошибок Ariphmetic
overflow, I/O cheking (I) - за контроль ошибок ввода-вывода. Смысл опции Stack
cheking (S) будет объяснен несколько позже, а опция Debug information (D)
включает в код программы отладочную информацию, что позволяет среде Turbo Pascal
при аварийном завершении программы показать курсором оператор, в котором
произошла ошибка. Позаботьтесь, чтобы при отладке программы перед первым ее
оператором была строка {$R+,C+,I+,S+,D+} - это поможет вам найти и устранить
все ошибки. Некоторые неопытные программисты выключают эти опции, тогда
программа не прерывается при некоторых ошибках, а продолжает выполняться, на
этом основании делается вывод, что программа верна. Это самообман - программа
выполняется, но выполняется неправильно и никак не сообщает об ошибках.
Список литературы
Для подготовки данной работы были использованы
материалы с сайта http://elib.albertina.ru/