Часть полного текста документа:Ошибки при выполнении программы. Опции компилятора С.А. Григорьев Умея пользоваться массивами, условными операторами и операторами цикла, вы можете писать довольно серьезные программы. При выполнении этих программ неизбежно будут возникать критические ошибки, приводящие к аварийному завершению программы. Такие ошибки по английски называются 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 от слишком большого (по абсолютной величине) вещественного числа. Эта ошибка довольно очевидна, и мы не станем ее иллюстрировать. Как же должен поступать программист, когда при выполнении его программы возникают ошибки? Прежде всего нужно локализовать ошибку, то есть найти оператор, в котором она произошла. ............ |