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