Страница 18 из 69
- 143,144 -
Использование Ctrl-Break
-----------------------------------------------------------------
Помимо всех заданных вами точек останова вы можете восполь-
зоваться во время выполнения программы "моментальной" точкой ос-
танова, нажав Ctrl-Break. Используя это средство, вы можете оста-
навливать программу в любой момент времени. Когда вы нажимаете
Ctrl-Break, вы выходите из программы и возвращаетесь в редактор
Турбо Си, причем маркер выполнения находится на строке, которая
должна быть выполнена в следующий раз, а сама программа готова
продолжить свою работу.
Объясним, как в действительности происходит останов програм-
мы при нажатии Ctrl-Break.
В процессе своей работы отладчик взаимодействует с DOS, BIOS
и другими частями операционной системы; поэтому ему известно, что
работает в данный момент времени (подпрограмма DOS, функция BIOS
или же именно фрагмент вашей программы). После того, как вы наж-
мете Ctrl-Break, отладчик дождется, чтобы заработала непосредс-
твенно ваша программа. Затем, на уровне инструкций микропроцессо-
ра, он сделает несколько шагов, чтобы дойти до кода,
соответствующему началу исходной строки на Си. И только после
всего этого он остановится и переведет маркер выполнения на дан-
ную строку.
Если же вы повторно нажмете Ctrl-Break прежде, чем отладчик
найдет и укажет строку программы, то он немедленно прервет работу
программы и не будет пытаться найти строку исходного текста. В
этом случае, программа останавливается без завершения своего вы-
вода и вызова какой-либо функции выхода. (Что аналогично заверше-
нию работы программы, выполняемому с помощью функции _exit). Поэ-
тому, дважды нажимать Ctrl-Break вам следует лишь тогда, когда
программа "зациклилась" и одно нажатие ее не останавливает.
- 145,146 -
Пошаговое выполнение "через функции"
-----------------------------------------------------------------
Теперь, когда вы достигли той части WORDCNT, в которой могут
быть ошибки, необходимо быть очень внимательным. Данный фрагмент
main будет обрабатывать по одной строке, сравнивая получаемые ре-
зультаты с желаемым эффектом.
Для того, чтобы выполнить одну строку main выберите Run/Step
Over. Отладчик отработал оператор while и считает первую строку
входного файла. Затем он переместит маркер выполнения на следую-
щую строку, содержащую исполняемые операторы. Повторно воспользо-
вавшись Run/Step Over можно выполнить следующий оператор
(printf).
Привело ли к желаемому эффекту выполнение оператора while?
Для того, чтобы определить это, выберите вариант User Screen из
меню Run, или нажмите Alt-F5. В результате этой команды вы увиде-
те экран выполнения. Т.к. на этом экране видна первая считанная
из файла строка, вы можете сделать вывод, что и while и printf
работают правильно. Для возврата в окно редактирования нажмите
любую клавишу.
"Горячей" клавишей для команды Run/Step Over является F8.
Поэтому, для выполнения очередного оператора нажмите F8, что при-
ведет к вычислению длины введенной строки, значение которой прис-
воится переменной i.
Внимание! "трассирование в" или "шаг через" библиотечную
функцию longjmp не приведет к остановке на следующей строке прог-
раммы (т.к. эта функция никогда не возвращается). По этой причине
ваша программа (в этом случае) будет выполняться до следующей
точки останова или до самого конца.
- 147,148 -
Вычисление выражений
-----------------------------------------------------------------
Приводит ли выполнение оператора присваивания к желаемому
результату? Узнать это можно оценив значение переменной i. Выбе-
рите Debug/Evaluate. Отладчик откроет окно содержащее три поля.
Мы будем называть эти поля в соответствии с присвоенными им функ-
циями:
1. Поле Evaluate (вычислений): сюда вы вводите те выражения,
которые вы хотите вычислить и, возможно, изменить. (Замечание:
Если длина вашего выражения превышает размер поля вычислений, то
для его просмотра вы можете воспользоваться клавишами управления
курсором).
2. Поле RESULT (результата): в это поле отладчик выводит
вычисленное значение.
3. Поле NEW VALUE (нового значения): в этом поле вы можете
присвоить своему выражению новое значение (при необходимости).
Отметим, что в поле вычислений инидицируется слово. Это сло-
во, перенесенное в данное поле из текущей позиции курсора в окне
редактирования, является значением поля вычислений, принятым по
умолчанию. Мы сразу же можем воспользоваться им. Однако в нашем
случае, введите выражение i и нажмите Ввод. В поле результата от-
ладчик поместит значение переменной i. Оно равно 43, что является
правильным. Для выхода из системы меню нажмите F10.
Следующая группа операторов программы проверяет, заканчива-
ется ли символом новой строки строка, считанная функцией fgets.
Если нет, то можно сделать вывод, что считанная строка является
слишком длинной для имеющегося буфера, и, поэтому, программа вы-
ведет соответствующее предупреждение. В противном же случае - все
в порядке. Программа удалит из строки найденный символ окончания,
для того, чтобы он не был включен в размер последнего слова.
Перед выполнением оператора if было бы очень полезно взгля-
нуть на введенную строку, для того чтобы узнать, что нужно ждать
от выполнения этого оператора. Установите курсор в окне редакти-
рования над словом linebfr и снова выберите элемент меню
Debug/Evaluate (или же "горячую" клавишу Ctrl-F4). Отладчик выве-
дет в появившееся окно (в поле вычислений) слово "linebfr". Наж-
мите Ввод.
- 149,150 -
Отладчик выведет:
To be or not to be: that is the question.\n
Точно также, как и в исходных текстах Си-программы, обозна-
чение "\n" соответствует символу конца строки.
Теперь, нажав F8, обработайте оператор if. В случае, если
этот оператор сработает правильно, маркер выполнения должен пе-
редвинуться на предложение "else". Выполните оператор присваива-
ния (под else), а затем вновь просмотрите linebfr. (Для этого вы
можете использовать Ctrl-F4 или элемент меню Debug/Evaluate).
Символ новой строки (\n) должен быть удален. Ну и слава богу,
пойдем дальше.
Функции nextword и wordlen
-----------------------------------------------------------------
Следующий оператор вызывает функцию nextword. Эта функция
определяет положение очередного (в данном случае - первого) слова
в строке. Обработайте этот оператор, используя F8, а затем пос-
мотрите wordptr для того, чтобы узнать что же вернула nextword.
Вы можете убедиться, что wordptr указывает на T в строке To be or
not to be: that is the question. Если это так, то nextword рабо-
тает правильно, по крайней мере в этом простом случае.
Следующим фрагментом программы является цикл while. Каждая
итерация этого цикла должна обрабатывать одно слово из linebfr,
знаращивая при этом wordptr так, чтобы он указывал на новое сло-
во. После того, как таким образом в этом цикле будет обработано
последнее слово, wordptr должен указывать на ограничивающий стро-
ку null символ, а сам цикл должен завершиться.
Выполните оператор while. Маркер выполнения переместится на
первый оператор в теле цикла, который вызывает функцию wordlen.
Эта функция определяет длину слова, на которое указывает wordptr.
Выполните оператор и оцените значение переменной i. Значение i
- 151,152 -