 |
TDeb 3.0 #2-3 = 148 =
'O' occurs 2 times, 1 times at start of a word
'R' occurs 1 times, 0 times at start of a word
'U' occurs 1 times, 0 times at start of a word
There is one word 3 characters long (8)
There is one word 4 characters long (9)
1 - аргументы; 2 - введите строку (пустая строка завершает
ввод); 3 - общее число букв; 4 - общее число строк; 5 - общее
число слов; 6 - среднее число слов на строке; 7 - 'E' встречается
1 раз, 0 раз в начале слова; 8 - имеется одно слово длиной в три
символа; 9 - имеется одно слово длиной в 4 символа.
Заметим, что в общем числе слов и букв имеется ошибка. Позд-
нее окажется, что таблицы частот букв и слов основываются на оши-
бочном значении счетчика букв и слов. Такая ситуация, когда в
программе сразу несколько неверных мест, довольно типична. Это
часто встречается на начальном этапе отладки.
Разработка плана действий
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Первая задача состоит в том, чтобы решить, с какой ошибкой
нужно разобраться в первую очередь. Хорошим правилом здесь явля-
ется следующее правило: начинайте с ошибки, которая произошла
"первой". В данной программе каждая вводимая строка разбивается
на слова, после чего анализируется, наконец, когда будут введены
все строки выводятся таблицы. Так как счетчики букв и слов, как и
таблицы, неверны, можно предположить, что что-то делается неверно
при начальной разбивке и подсчете.
Теперь, после того, как вы немного обдумали проблему и наме-
тили в общих чертах пути решения, пора начать отладку. Здесь
стратегия будет состоять в том, чтобы проверить подпрограмму
makeintowords и посмотреть, правильно ли она разбивает строку на
завершающиеся нулевым символом слова, а затем посмотреть, пра-
вильно ли подпрограмма analyzewords выполняет подсчет для анали-
зируемой строки.
Запуск Турбо отладчика
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Чтобы запустить пример сеанса отладки, наберите:
TD BCDEMOB
При этом Турбо отладчик загрузит демонстрационную программу,
в которой содержится ошибка, и выведет начальный экран. Если вы
хотите выйти из сеанса отладки и вернуться в DOS, нажмите клавиши
Alt-X (это можно сделать в любой момент). Если вы безнадежно
"заблудились", можно в любое время перезагрузить демонстрационную
программу, нажав клавиши Ctrl-F2, и начать сначала (при этом точ-
ки останова и выражения просмотра очищены не будут).
TDeb 3.0 #2-3 = 149 =
Поскольку первое, что нам нужно сделать - это проверка пра-
вильности работы подпрограммы makeintowords, нужно выполнить
программу до выполнения этой подпрограммы, а затем проверить все,
что требуется. В этом случае можно использовать два подхода: вы
можете выполнить шаг программы, выполнив makeintowords и убедив-
шись,что она делает все правильно, или можно остановить программу
после выполнения подпрограммы makeintowords, и проверить ее ре-
зультаты.
Убедиться в правильности работы подпрограммы makeintowords
довольно просто. Для этого можно проверить формируемый ей выход-
ной буфер. Давайте выберем второй подход. Чтобы сделать это, пе-
реместите курсор на строку 42 и нажмите клавишу F4, выполнив
программу до этой строки. Появится экран программы, после чего
вам нужно ввести:
one two three
и нажать клавишу Enter.
Проверка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Итак, вы остановились на строке исходного кода после вызова
функции makeintowords. Взгляните на содержимое буфера и посмотри-
те, все ли правильно. Переместите курсор на одну строку вверх и
поместите его под словом buffer. После этого нажмите Alt-F10 (для
вывода окна Inspector (Проверка)). В окне проверки выведется со-
держимое буфера buffer. Для просмотре элементов массива исполь-
зуйте клавиши стрелок. Обратите внимание, что подпрограмма
makeintowords действительно поместила в конце каждого слова нуле-
вой символ (0). Это означает, что вам нужно просмотреть другую
часть программы и проверить, правильно ли работает подпрограмма
analyzewords. Для этого сначала удалите окно проверки, нажав кла-
вишу Esc. Затем дважды нажмите клавишу F7 для выполнения програм-
мы до начала работы analyzewords.
Проверьте, что analyzewords была вызвана с корректным указа-
телем в буфере. Для этого переместите курсор под bufp и нажмите
Alt-F10 I. Вы увидите, что bufp действительно указывает на завер-
шающуюся нулевым символом строку 'one'. Для удаления окна про-
верки нажмите клавишу Esc. Поскольку ошибка возникает, очевидно,
при подсчете символов и слов, давайте поместим точку останова в
то место, где подсчитываются слова и символы.
1. Переместите курсор на строку 93 и нажмите клавишу F2,
чтобы установить точку останова.
2. Переместитесь на строку 97 и установите другую точку ос-
танова.
2. Наконец, установите точку останова на строке 99, благода-
ря чему вы сможете увидеть значение счетчика символов,
TDeb 3.0 #2-3 = 150 =
возвращаемое данной функцией.
Задание нескольких точек останова (как в данном примере) -
это типичный способ, позволяющий узнать, все ли в программе дела-
ется правильно, и проверить значения важных данных при каждом ос-
танове программы на очередной точке останова.
TDeb 3.0 #2-3 = 151 =
Окно Watch
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Запустите программу, нажав клавишу F9. Программа остановит-
ся, когда она достигнет точки останова на строке 93. Теперь можно
просмотреть значение charcount (счетчик символов). Так как вы хо-
тите проверять его каждый раз, когда встречается данная точка ос-
танова, удобно использовать команду Watch (Просмотр), чтобы по-
местить charcount в окно Watches (Просмотр). Переместите курсор
под wordcounts (счетчик слов) и нажмите Alt-F10 W. В окне прос-
мотра в нижней части экрана выводится текущее значение 0. Чтобы
убедиться, что символ подсчитывается правильно, выполните одну
строку, нажав клавишу F7. В окне просмотра (Watches) действитель-
но выводится, что значение charcount = 1.
Диалоговое окно Evaluate/Modify
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Снова запустите программу, нажав клавишу F9. Теперь вы вер-
нулись на строку 93 для обработки другого символа. Снова дважды
нажмите F9 для считывания последней буквы слова и завершающего
нуля. Теперь charcount показывает корректное значение 3, а массив
wordcounts будет обновлен для подсчета слов. Далее все отлично.
Нажмите снова F9, чтобы начать обработку следующего слова в буфе-
ре. Ага! Что-то не так.
Вы ожидаете, что программа остановится снова на строке 93
(на точке останова) для обработки другого символа. Но она этого
не делает. Она выполняется дальше и возвращается из функции.
Единственным путем оказаться на строке 99 является истинное зна-
чение проверяемого в цикле while значения. Это означает, что
*bufp != 0 должно при вычислении получать ложное значение
(false).
Чтобы проверить это, переместитесь к строке 83 и отметьте
все выражение *bufp != 0, поместив курсор под *, нажав клавишу
Ins, и переместив курсор на завершающий 0 перед ). Теперь вычис-
лите это выражение, открыв диалоговое окно DataіEvaluate/Modify
(ДанныеіВычисление/Модификация) и нажав клавишу Enter, а затем
выбрав переключатель Eval (Вычисление), чтобы отмеченное выраже-
ние было воспринято. Значение в самом деле равно 0. Нажмите дваж-
ды клавишу Esc для возврата в окно Module (Модуль).
Эврика!
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Теперь, чтобы обнаружить ошибку, нужно сделать некий анали-
тический скачок. Причина того, что bufp указывает на 0, состоит в
том, что внутренний цикл while, начинающийся на строке 86, остав-
ляет его в конце слова. Для продолжения на следующем слове вы
должны увеличить bufp и переместить его с 0, который завершал
TDeb 3.0 #2-3 = 152 =
предыдущее слово. Для этого перед строкой 97 нужно добавить опе-
ратор "bufp++". Вы можете перекомпилировать свою программу с этим
оператором, однако Турбо отладчик позволяет вам "вставлять" выра-
жения, используя для этого особый вид точек останова.
Для этого нужно сначала перезагрузить программу, нажав кла-
виши Ctrl-F2 (после этого вы можете начать проверку, сбросив сос-
тояние программы). Теперь удалите все точки останова, которые бы-
ли вами установлены в предыдущем сеансе отладки, для чего нажмите
клавиши Alt-B D. Вернитесь к строке 97 и снова установите точку
останова, нажав клавишу F2. Теперь откройте окно Breakpoints
(Точки останова), нажав клавиши ALt-V B. Установите эту точку ос-
танова, чтобы выполнять выражение bufp++ каждый раз, когда оно
встречается. Для этого сделайте следующее:
1. Выберите команду ViewіBreakpoint (ОбзоріТочка останова).
2. Откройте окно Breakpoints (Точки останова), нажав клавиши
|