Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование лекции.doc
Скачиваний:
49
Добавлен:
12.11.2019
Размер:
5.53 Mб
Скачать

20.2. Инструменты отладки программ

Важнейший инструмент отладки – точка прерывания (breakpoint). Когда программа в своей работе доходит до точки прерывания, ее выполнение временно прекращается. Пока программа остановлена, можно просмотреть и даже изменить значения переменных, а затем продолжить ее выполнение.

Точка прерывания ставится на строчку программы. В Delphi это делается клавишей F5. Строка, в которой установлена точка прерывания, в редакторе помечается красным цветом (Рис. 20 .76).

Бесполезно ставить точку останова на операторы END, VAR, CONST, TYPE, FUNCTION, PROCEDURE, UNIT – они не являются исполняемыми. Разумеется, не сработает и точка прерывания, стоящая внутри процедуры, если эта процедура ниоткуда не вызывается на выполнение.

Как только точка прерывания достигнута, можно просмотреть текущие значения переменных. А вот сам текст программы "на ходу" менять нельзя – если текст изменен, придется компилировать заново. Окно просмотра значений переменных вызывается клавишами Ctrl+F7 (Рис. 20 .77).

Рис. 20.76. Точка прерывания.

В поле Expression можно вводить не только имя переменной, но и целое математическое выражение. Это позволяет использовать окно просмотра как мощный калькулятор.

Интересная возможность окна просмотра – изменение значения переменной. Если в процессе отладки установлено, что некоторая переменная получила неверное значение, то для продолжения работы программы можно ввести правильное значение в поле Modify и нажать кнопку Modify.

Рис. 20.77. Окно просмотра значений переменных.

Кстати, а как продолжить выполнение программы, остановленной на точке останова? Очень просто – нажав F9. Для полного же прерывания выполнения программы служат клавиши Ctrl+F2.

Если в программе есть циклы, то отладка затрудняется – при каждой итерации придется нажимать Ctrl+F7, вводить имя переменной, и так не один десяток раз. Для удобства помимо обычного окна просмотра в Delphi предусмотрено и так называемое окно постоянного просмотра (вызывается клавишами Ctrl+Alt+W). В него вводятся (при помощи клавиши Insert) переменные и выражения, значения которых постоянно отображаются. Как только программа остановилась на точке останова, все значения уже на экране (Рис. 20 .78).

Рис. 20.78. Окно постоянного просмотра.

А можно ли выполнять программу пошагово, по одной строке? Да, конечно. Для этого служат клавиши F4, F7 и F8. Клавиша F4 запускает программу до курсора, F7–с заходом в процедуры/функции, F8–без захода в процедуры/функции. Текущая выполняемая строка в программе отмечается синей полосой. Для сброса программы (досрочного прекращения ее работы) предназначена комбинация клавиш Ctrl+F2.

20.3. Типичные ошибки в программировании

В данном разделе представлены наиболее типичные ошибки, встречающиеся в программах на 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