Ошибки при выполнении программы
Программа скомпилировалась, но остановилась во время работы. Значит, на каком-то шаге данные оказались такими, с которыми действие выполнить нельзя. PascalABC.NET показывает текст ошибки, Free Pascal — номер вида Runtime error 200.
| Что случилось | PascalABC.NET | Free Pascal |
|---|---|---|
деление нацело на ноль: div 0, mod 0 | «Попытка деления на ноль» | Runtime error 200 |
| индекс за границами массива | «Индекс выходит за границы массива» | Runtime error 201, если включена проверка, иначе ошибки может не быть |
| ввели не число, когда ждали число | сообщение о неверном формате | Runtime error 106 |
| файла для чтения нет | сообщение, что файл не найден | Runtime error 2 |
| бесконечная рекурсия | «Программа завершена из-за переполнения программного стека» | Runtime error 202 или аварийное завершение |
Деление на ноль
Проверяйте делитель до деления:
program SafeDiv;
var
a, b: integer;
begin
readln(a, b);
if b = 0 then
writeln('На ноль делить нельзя')
else
writeln(a div b, ' и остаток ', a mod b);
end.17 0На ноль делить нельзяНоль часто появляется не при вводе, а в расчётах: среднее у пустого массива при n = 0, счётчик, который не увеличился ни разу.
Деление дробью / на ноль ведёт себя по-разному: Free Pascal обычно останавливает программу с ошибкой, а PascalABC.NET продолжает работу и получает бесконечность или «не число» (NaN). Ни то ни другое не ответ — делитель проверяют в обоих случаях.
Выход за границы массива
У массива a: array[1..10] of integer нет элементов a[0] и a[11]. Типичные причины:
- цикл
for i := 0 to nвместоfor i := 1 to n; - обращение к соседу
a[i + 1]в цикле доn— на последнем шаге этоa[n + 1]; цикл должен идти доn - 1; - введённое
nбольше размера массива.
PascalABC.NET проверяет индексы всегда. Free Pascal по умолчанию — нет: программа молча читает или портит чужую память, и ошибка проявляется позже и в другом месте, иногда как Runtime error 216. Включите проверку при компиляции:
fpc -Cr prog.pasС ключом -Cr выход за границы сразу останавливает программу с Runtime error 201 — так ошибку легко найти.
Неверный ввод
Если программа ждёт число, а человек набрал abc, readln не может его прочитать. С дробными числами осторожнее: 2,5 с запятой Free Pascal не прочитает, а PascalABC.NET может прочитать как 25 — без всякой ошибки. Дробные числа набирайте через точку. Чтобы программа не падала от чужого ввода, читайте строку и проверяйте её процедурой val — пример в справке Как перевести число в строку и обратно.
Как найти место ошибки
- При запуске из PascalABC.NET среда обычно указывает строку программы, на которой случилась ошибка, — начните с неё.
- Выведите промежуточные значения:
writeln('i = ', i, ' n = ', n);перед подозрительной строкой. Последний вывод перед ошибкой подскажет, на каком шаге она случилась. - Проверьте крайние случаи: ноль, одно значение, наибольший размер массива.