Страница 19 из 69
равно 0, что является неправильным; длина первого слова обрабаты-
ваемой строки должна быть равна 2. Мы нашли ошибку!
Остановимся и подумаем
-----------------------------------------------------------------
Прежде чем вы исправите найденную ошибку, давайте обсудим ее
влияние на отлаживаемую программу. Некорректная длина слова (0)
"имеет" два значение. Во-первых, из-за нее неправильно увеличится
значение нулевого элемента массива wordlencnt. А во-вторых, нуле-
вая длина приведет к тому, что после обработки оператора wordptr
+= i, значение указателя wordptr не изменится. Из-за этого, вто-
рая итерация цикла loop начнется с тем же самым значением
wordptr, что и в первой. Поэтому, точно также как и при первом
обращении к wordlen (когда она вернула 0), повторный вызов этой
функции также возвратит все тот же 0. Следовательно, значение
wordptr останется неизменным и в третьей итерации цикла loop, и в
четвертой, и в последующих. Таким образом, найденная ошибка явля-
ется причиной "зависания" вашего компьютера.
Какой вывод можно сделать из проведенного исследования? Вы
можете подумать, что найденная ошибка объясняет только часть неп-
равильной работы WORDCNT или же, что неправильная работа програм-
мы объясняется не только найденной ошибкой. Для того, чтобы уви-
деть, что же происходит дальше, в обоих случаях вы можете
- 153,154 -
захотеть вновь запустить программу. Сделав это, вы захотите сос-
редоточиться на обнаружении новых ошибок, причем, понятно, вы за-
хотите, чтобы уже просмотренный фрагмент программы работал пра-
вильно.
Что же делать?
-----------------------------------------------------------------
Вы выяснили, что неправильная работа WORDCNT объясняется
ошибкой в функции wordlen. Кроме того вы точно определили, в чем
выражается неправильная работа этой функции. Чуть позже мы вер-
немся к этим рассуждениям, а сейчас давайте познакомимся с коман-
дами отладчика. В процессе вашей первой попытки отладки программы
WORDCNT вы делали следующее:
# убеждались в том, что опции Debug/Source Debugging и O/C/C
/OBJ Debug включены (On).
# для подготовки WORDCNT к отладке выбирали Compiler/Build
All.
# пользуясь командами редактора, перемещали курсор на нужные
фрагменты WORDCNT; выбирали Break/Watch/Toggle Breakpoint
для установки точек останова в позиции курсора; для запус-
ка WORDCNT до заданной точки останова пользовались Run/Run
(или же "горячей" клавишей Ctrl-F9).
- 155,156 -
# пользовались Run/USER SCREEN или Alt-F5 для просмотра вы-
ходных данных вашей программы на пользовательском экране.
# для обработки операторов функции main (по одной строке
программы за шаг) выбирали Run/Step Over (или же нажимали
"горячую" клавишу F8).
# выбрав Debug/Evaluate (или нажав Ctrl-F4), просматривали
значения нескольких переменных.
# проанализировав найденную ошибку, сделали вывод, что она
объясняет некорректную работу WORDCNT и, поэтому, требует
немедленного исправления.
Содержимое окна вычислений, установленное по умолчанию
-----------------------------------------------------------------
Напомним, что выбор Debug/Evaluate переносит в поле вычисле-
ний слово, на которое указывает курсор в окне редактирования.
Благодаря этому, вы можете облегчить себе работу, если перед об-
ращением к Debug/Evaluate установите курсор над переменной , зна-
чение которой вы хотите оценить. Даже если все выражение, которое
вы хотите вычислить, является весьма сложным, то вы можете значи-
тельно ускорить его ввод, если будете редактировать принятое по
умолчанию в окно вычислений выражение, а не вводя его на пустом
месте. Более того, нажимая клавишу со стрелкой вправо вы можете
"перенести" из окна редактирования в окно вычислений еще несколь-
ко требуемых вам символов. Каждый раз, когда вы будете нажимать
эту клавишу, будет выполняться перенос одного символа.
Например, пусть вы хотите вычислить значение выражения
linebfr[i-1], которое находится в следующей строке исходного фай-
ла:
if (linebfr[i-1] != '\n' )
- 157,158 -
Для этого переместите курсор к linebfr и выберите
Debug/Evaluate. В поле вычислений (Evaluate) будет скопировано
слово linebfr. Нажав пять раз клавишу со стрелкой вправо, добавь-
те к этому слову [i-1], затем нажмите Ввод.
Изменение значения оцениваемого выражения
-----------------------------------------------------------------
Элемент меню Debug/Evaluate способен изменять значения неко-
торых типов выражений, а именно, тех выражений, которые соответс-
твуют конкретному элементу данных, например: i, linebfr[i] или
*(linebfr+i).
Попробуем вычислить значение переменной i, а затем изменить
его. После того, как для получения значения переменной i вы наж-
мете Ввод, отладчик выведет это значение в поле результата. Пе-
рейдите (с помощью клавиши со стрелкой вниз) в поле нового значе-
ния и введите в него то значение, которое вы хотите присвоить i.
Например, вы можете ввести i+1 (с целью увеличения i на страницу)
или же просто 17. После того, как вы нажмете Ввод, отладчик вы-
числит введенное вами выражение, изменит значение i, а затем вы-
ведет в поле результата новую величину. (Замечание: Запомните!
После того, как в поле новой величины в нажмете Ввод, значение
переменной будет измененно в соответствии с введенным выражением
и нажатие после этого клавиши Esc не приведет к отмене сдаланных
изменений.) Для того, чтобы выйти из Debug/Evaluate, нажмите Esc,
затем снова выберите Debug/Evaluate и посмотрите значение пере-
- 159,160 -
менной i с тем, чтобы убедиться в том, что оно изменилось. После
этого восстановите старое значение i и опять выйдите из
Debug/Evaluate.
Изменив значение какого-либо выражения, вы можете избежать
проявления программной ошибки, что позволит вам запустить свою
программу дальше, в результате чего могут быть найдеты какие-либо
дополнительные ошибки. Кроме этого изменение значений выражений