В данном разделе представлены наиболее типичные ошибки, встречающиеся в программах на Delphi, их симптомы, примеры кода и методы исправления.
Табл.
Симптом
| Пример кода
| Причина
|
программа при каждом запуске работает по-разному
| VAR s:WORD; I:BYTE; BEGIN FOR I:=1 TO 20 DO s:=s+1; WriteLn(f,s)
| не инициализирована переменная, поэтому при каждом запуске она принимает случайное значение.
|
программа «зависает»
| VAR l:BOOLEAN; a:longint; BEGIN l:=TRUE; a:=0; WHILE L DO a:=a+1;
| В циклах WHILE/REPEAT не меняется значение переменной, стоящей в условии цикла (вечный цикл)
|
часть кода не выполняется
| VAR l:BOOLEAN; a:longint; BEGIN a:=0; WHILE L DO BEGIN WriteLn(f,‘Ho!’); L:=FALSE END;
| В циклах и условиях не инициализируется значение переменной, стоящей в условии
|
не работает CASE
| CASE f OF 1..10: Writeln(f,‘a’); 2..5: WriteLn(f,‘b’) END;
| Диапазоны пересекаются
|
syntax error на явно правильную строчку
| WriteLn(f,'123’);
| вкралась русская буква
|
программа намертво вешает машину при каждом запуске
| TYPE TA=ARRAY[1..1000] OF REAL; VAR p:POINTER; s:POINTER;
BEGIN GetMem(p,SizeOf(byte)); GetMem(s,SizeOf(ta)); … FreeMem(p,SizeOf(ta)); FreeMem(s,SizeOf(byte)); END.
| ошибка в работе с динамической памятью. Данные записываются не туда
|
программа намертво вешает машину при каждом запуске
| TYPE TA=ARRAY[1..1000] OF REAL; VAR a:TA; I:WORD;
BEGIN FOR I:=1 TO 2000 DO a[I]:=0.0 END.
| Выход за пределы массива
|
не срабатывает IF
| C:=SIN(PI); D:=SIN(PI); IF C=D THEN WriteLn(f,‘!!!’)
| Ограниченная точность вычислений с плавающей точкой. Вещественные числа нельзя сравнивать
|
лишняя итерация в цикле
| Begin i:=0; repeat writeln(f,'*'); i:=i+1 until i>10; end.
| в вычислительных задачах используется цикл WHILE, а не REPEAT
|