Глиф Учебники

Ошибки при выполнении программы

Справочник · Pascal · 2 минуты чтения

Программа скомпилировалась, но остановилась во время работы. Значит, на каком-то шаге данные оказались такими, с которыми действие выполнить нельзя. PascalABC.NET показывает текст ошибки, Free Pascal — номер вида Runtime error 200.

Что случилосьPascalABC.NETFree Pascal
деление нацело на ноль: div 0, mod 0«Попытка деления на ноль»Runtime error 200
индекс за границами массива«Индекс выходит за границы массива»Runtime error 201, если включена проверка, иначе ошибки может не быть
ввели не число, когда ждали числосообщение о неверном форматеRuntime error 106
файла для чтения нетсообщение, что файл не найденRuntime error 2
бесконечная рекурсия«Программа завершена из-за переполнения программного стека»Runtime error 202 или аварийное завершение

Деление на ноль

Проверяйте делитель до деления:

Pascal
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]. Типичные причины:

PascalABC.NET проверяет индексы всегда. Free Pascal по умолчанию — нет: программа молча читает или портит чужую память, и ошибка проявляется позже и в другом месте, иногда как Runtime error 216. Включите проверку при компиляции:

Bash
fpc -Cr prog.pas

С ключом -Cr выход за границы сразу останавливает программу с Runtime error 201 — так ошибку легко найти.

Неверный ввод

Если программа ждёт число, а человек набрал abc, readln не может его прочитать. С дробными числами осторожнее: 2,5 с запятой Free Pascal не прочитает, а PascalABC.NET может прочитать как 25 — без всякой ошибки. Дробные числа набирайте через точку. Чтобы программа не падала от чужого ввода, читайте строку и проверяйте её процедурой val — пример в справке Как перевести число в строку и обратно.

Как найти место ошибки