Программирование >>  Аргументация конструирования 

1 ... 35 36 37 [ 38 ] 39 40 41 ... 108


Таблице. 1. Команды отладчиков MicrosoftVisualC++и GNUrhide

КОМАНДА

VBUALC++

GNU C++

(RHIDE:)

Собрать (Build)

<Shift+F8>

<F9>

Шаг с входом в функцию (Step In)

<F11 >

<F7>

Шаг без входа в функцию (Step Over)

<F10>

<F8>

Просмотр переменной (View Variable)

Только в меню

<Ctrl-rF4>

Уановка точки оанова (Set Breakpoint)

<F9>

<CtrlTFS>

Наблюдение; за переменной (Add watch)

Только в меню

<Ctrl+F7>

Выполнение (Go)

<F5>

<Ctrl-rF9>

Просмотр экрана пользователя (View User

Щелчок в окне программы

<Alt+F5>

Screen)

Перезагрузка программы (Program Reset)

<Shift+F5>

<Ctrl+F2>

Запуск тестовой программы

Лучший способ исправить ошибки в программе - пройти ее пошагово. Приведеп-ная ниже программа содержит несколько i6oK. которые надо найти и исправить.

atenate - соединяем две строки и добавляет

- между jKbai .

(в этой версии содержатся ошибки)

iinclude <ST:dio.h> #include <ios-resir.. h>

voi har szTarget [:, char szSource[]);

in 1 , i.it nArg lar* pszArgs[]) {

cout Эта программа соединяет две строки\п ; cout << (Эт ракма содержит о::1ибки. ) \с\п ;

считать первую строку... char szStrir.gl [256] ; cout << Введите строку #1: ; cin.iietline (szStrinqd, 128] ;

теперь вторую.. . cha ing2 [128]; cout << Введите строку #2: ; cin . getline ( S2Str.lng2 , 128; ;

...присоединить -

к кон первой.. . - ) ;

...теперь добавить вторую строку... concatString(szStringl, szString2);

. . .и показать результат cout << \n << szStringl << \n ;

return

concatString

присоединяет* jszSource к окончанию



строки* pszTarget

void concatstring (char szTarget [] , char szSourceГ]) i

int riTarget Index; int nSourcelndex;

найти конец первой строки

while(szTarget[++nTargetIndexi )

присоединяет строку к концу первой

while(szSource[nSourcelndex])

szTarget[nTargetlndex] =

szSource[nSourcelndex] ; nTargetIndex++;

nSourceIndex++;

Соберите и запустите программу. Когда она запросит первую строку, введите что-нибудь наподобие это строка , а на запрос второй строки введите ЭТО СТРОКА (впрочем, можно писать все, что угодно).

Вместо объединения двух строк программа завершится с кодом выхода Oxff. Щелкните на ОК (других вариантов у вас все равно нет). Чтобы утешить вас, отладчик откроет окно, содержащее следующую информацию:

Call frame traceback

Concatenate, срр (4 9 concatstring FPcTO

Concatenate . cpp (28) in function mam in function crtl startup+174

Из этого видно, что ошибка возникла в строке 49 модуле mate. срр, которая находится в функции concatStringO, вызванной в строке 28 функции main ().

Строка 49 имеет вид

while(szTarget f++nTargetIndex])

А строка 28 содержит вызов функции concatstring(szStringl, - ) ;

Внешне вроде бы все порядке и с командой в строке 49, и с вызовом функции в строке 28. Чтобы найти ошибку, понадобится отладчик.

Примечание. Хотя вы уже встречались с похожей ошибкой, я все равно настоятельно советую детально разобрать этот пример.

Пошаговое выполнение программы

Первое, что стоит сделать при поиске ошибки с помощью отладчика, - это выполнить программу в пошаговом режиме. В среде riiide выполните команду Run<>Program Reset.

Примечание. Из табл. 11.1 видно, что в rhide эта команда выполняется с помошью клавиш <Ctrl+F2> {или клавиш <Shift4-F5> в Visual С+ + ). Больше я не бупу давать подсказок, поскольку все необходимые команды содержатся в табл. 11.1. Кроме того, все команды, используемые в этой главе, доступны из выпадающих меню среды разработчика.

Команда Program Reset заставляет отладчик заново начать работу с программой {а не с того места, где вы находитесь). Никогда не вредно перезагрузить отладчик перед

началом работы.

Выполните команду Step Over (пошаговое выполнение без входа в функции). Среда rhide откроет окно mS DOS, как и в нормальном режиме, однако сразу после этого переключится в окно редактирования программы, выделив первую исполняе-



мую команду. (Исполняемой называется любая команда, которая не является объявлением или комментарием. Именно исполняемая команда вызывает создание машинного кода во время компиляции.)

После запуска отладчик выполняет все команды вплоть до первой строки функции main (), а затем перехватывает управление. Теперь отладчик ожидает действий со стороны программиста.

Еще раз выполните команду Step Ove - rhide вновь на секунду перейдет в окно пользователя и затем вернется в окно редактирования программы. Теперь будет выделена следующая строка. Щелкните мышью на окне пользователя (User Screen), и вы увидите выведенную во время выполнения предыдущей команды строку

программа соединяет две строки.

Выполнение программы в таком режиме называется пошаговым. Необходимо продолжать выполнение программы в пошаговом режиме до тех пор, пока она не выдаст

сообщение об ошибке. Знание команды, которая вызвала ошибку, очень поможет при

ее исправлении.

Когда вы попытаетесь выполнить команду Step Over в строке с вызовом функции cin. getline О, отладчик не вернет управление среде разработчика, как обычно. Может показаться, что программа зависла, но причина в другом: отладчик не перехватывает управления, пока не завершится команда, а функция getline () не может завершиться, пока пользователь не введет строку с клавиатуры.

Введите первую строку и нажмите <Enter>. Теперь отладчик перехватит управле-

cout

и остановит

Введите строку

выполнение программы #2 : . Выполните еше один шаг

после команды и введите вторую строку.

Если отладчик остановился и не возвращается в среду программиста при пошаговом выполнении, это означает, что программа ожидает какого-то события. Скорее всего, программа ожидает ввода с клавиатуры или с другого внешнего устройства.

При попытке выполнить функцию concatstring {) в пошаговом режиме Step Over программа снова выполнит аварийный останов, как и ранее (рис.



e2.%aW-W:0\yin ГЬ ZOOM-Иг; Next=Ш1-49] Ж1 1 Fie Menu П1 L-H.Quit;:.a:;:a-

Рис. 11.4. Ошибка в функции concatstring} заставляет программу аварийно завершаться



1 ... 35 36 37 [ 38 ] 39 40 41 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика