Лекции по проге / Rabota_v_srede_Visual_Studio_2005
.pdf
Для задания соответствующего свойства текстового редактора необходимо выбрать пункт меню Tools > Options и в появившемся окне в разделе Text Editor > All Languages >
General выставить флаг Line Numbers (см. рис. 10).
Рис.10. Задание свойства текстового редактора «нумерация строк»
2.1.4. Построение приложения (сборки) и запуск его на выполнение
Для выполнения программы, подготовленной на алгоритмическом языке, необходимо осуществить достаточно длинную цепочку технологических действий – программу нужно откомпилировать и убедиться, что в ней отсутствуют синтаксические ошибки, далее программу надо собрать ("слинковать") вместе со всеми используемыми служебными модулями - в результате
получается готовое к исполнению приложение (сборка), т.е. исполняемый файл с расширением exe.
2.1.4.1. Запуск сборки на выполнение
Построение сборки (команда Build пункта меню Build) и запуск ее на выполнение (команда Start Debugging пункта меню Debug) могут быть выполнены раздельно, однако достаточным является и применение одной команды Start Debugging, т.к. при выполнении
этой команды проверяется соответствие имеющейся сборки и программного кода в редакторе и, если после времени построения последнего варианта сборки в программном коде были поведены какие-либо изменения, то автоматически будет вызван компилятор и сформирован новый вариант
11
сборки. Выполнение команды Start Debugging, как можно увидеть в пункте меню, можно обеспечить и простым нажатием клавиши F5.
При запуске на выполнение подготовленной на предшествующих шагах программы могут возникнуть две различные ситуации:
− Программа подготовлена правильно, в этом случае запуск сборки произойдет без обнаружения ошибок, на экране дисплея мелькнет окно вывода результатов и практически моментально исчезнет. Для наблюдения итогов выполнения программы окно вывода надо задержать – это можно обеспечить, например, при помощи вызова процедуры ввода:
// Приостановка окна вывода – для языка програмирования C++
_getch();
В этом случае при переходе на вызов метода getch() выполнение программы будет приостановлено и мы получим возможность рассмотрения результатов вывода программы – см.
рис. 11. Для продолжения работы программы достаточно нажать клавишу Enter (отметим еще раз, что метод ввода getch() используется в данном примере только для организации
приостановки окна вывода, а не для реального ввода данных);
Рис. 11. Окно вывода результатов программы
− Другая ситуация возникает при обнаружении ошибок при построении сборки – в этом случае, естественно, выполнение сборки невозможно и для ее подготовки необходимо найти и исправить все имеющие ошибки в программном коде программы.
При перенесении проекта на другой компьютер (например из дома в лабораторию) в некоторых случаях бывает необходимо заново скомпилировать и собрать программу. Если дома программа работала нормально, а в лаборатории выдает непонятные ошибки, попробуйте перекомпилировать ее с помощью команды Build пункта меню Build.
2.1.4.2. Обработка синтаксических ошибок
При обнаружении синтаксических ошибок, компилятор спрашивает запускать ли предыдущую рабочую сборку (см. рис. 12).
12
Рис. 12. Окно с сообщением о наличии синтаксических ошибок
Если нажать кнопку No (Нет), то компиляция программы завершается, а в окне Output выводится сообщение о количестве ошибок и предупреждений (см. рис. 13).
Рис. 13. Окно с сообщением о количестве синтаксических ошибок
В некоторых случаях (например если ранее была отмечена галочка внизу), диалог может не
появляться. Если вы изменяете программу, а она продолжает выполняться по-старому, то ее следует собрать заново с помощью команды Build пункта меню Rebuild и обратить внимание,
не присутствуют ли ошибки в процессе компиляции и сборки.
Более подробную информацию об ошибках и предупреждениях можно получить в окне Error List (см. рис. 14), которое вызывается по команде меню View > Other Windows >
Error List.
Рис. 14. Окно с перечнем синтаксических ошибок и предупреждений
В этом окне для каждой обнаруженной ошибки приводится ее краткое описание. Сообщение об ошибке можно выделить и, нажав клавишу F1, получить справочную информацию по допущенной ошибке. Нажав клавишу Enter (или выполнив двойной щелчок мыши) можно перейти в окно редактора на строчку с оператором, в котором была обнаружена ошибка. Следует
13
отметить, что "правильное понимание" выдаваемых компилятором сообщений требует определенной практики (если бы компилятор мог абсолютно точно выделять ошибочные ситуации в программе, то тогда исправление ошибок могло бы происходить автоматически). Так, например, если в правильной программе в методе main() удалить открывающую фигурную скобку {, то в окне Error List будет выведено 17 (!) сообщений об ошибках.
2.1.5. Тестирование и отладка программ
Практические навыки эффективного тестирования программ, умение быстро определять причины самых сложных ошибок составляют основу профессии программиста. Из опыта выполнения реальных проектов разработки сложного программного обеспечения следует, что до половины общего времени работ занимают как раз этапы тестирования и отладки программ. Безусловно, полное изучение данных вопросов требует и достаточно большого объема учебного времени, и наличия определенного практического опыта разработки сложных программ.
2.1.5.1. Подготовка тестовых заданий
После подготовки программы и исправления синтаксических ошибок наступает этап тестирования. Под тестовым заданием (или просто тестом) обычно понимается набор исходных данных, при использовании которых в программе должны получиться заранее определенные результаты. Отметим ряд основных принципов тестирования:
1.Тесты должны подготавливаться на начальных этапах разработки программ (в идеальном случае, на этапе постановки задачи);
2.Успешность выполнения теста (т.е. когда результаты выполнения программы совпадают с прогнозируемыми) не являются доказательством правильности программы, т.к. тест проверяет только вполне конкретные условия работы программы; полное (исчерпывающее) тестирование обычно нереализуемо из-за практически неограниченного множества различных вариантов исходных данных – с другой стороны, хорошо подготовленный комплект тестов может проверить основные режимы работы программы и выявить большинство имеющихся ошибок в программе;
3.Подготавливаемые тесты должны проверять основные варианты выполнения программы и должны быть в максимальной степени направлены на выявление ошибочных ситуаций в реализованных алгоритмах решения поставленной задачи (хороший тест – это тест, выявляющий наличие ошибки в программе (!) );
4.Тест должен быть достаточно небольшим (по объему исходных данных) и быстро выполняемым. Если требуется большой тестовый пример, его удобно набрать в блокноте и копировать в окно программы каждый раз при ее запуске.
14
2.1.5.2. Методы поиска ошибок (отладки)
Итак, признаком наличия ошибки в программе является неправильное выполнение теста (во время теста выполнение программы завершается аварийно или результаты выполнения программы не совпадают с прогнозируемыми результатами теста). Процесс выявления причин обнаруженной ошибки, определение места (локализация) ошибки в программе и исправление ошибочно реализованного программного кода обычно называется отладкой. Как правило, при отладке существует некоторая предварительная стадия, во время которой программист выдвигает те или иные предложения о причинах ошибочной работы и проводит визуальный анализ (инспекцию) программного кода – к сожалению, данной формой отладки многие программисты пренебрегают, хотя эффективность такого способа отладки является достаточно высокой. Если при инспекции кода выявить ошибки не удается, далее наступает основной способ отладки – отладочное выполнение программы (или трассировка), в ходе которого работа программы может быть приостановлена для просмотра значений тех или иных переменных программы с целью обнаружения ситуаций, когда эти значения не соответствуют предполагаемым значениям. Тем
самым, задача трассировки – обнаружение информационных признаков проявления ошибки. Рассмотрим далее возможности среды MS Visual Studio 2005 для обеспечения
трассировки программ при поиске и исправления ошибок.
2.1.5.3. Пошаговое выполнение программы
Пошаговое выполнение программы позволяет определить какие команды выполняются в процессе решения задачи и в какой последовательности. Этот метод тестирования позволяет обнаружить следующие виды ошибок:
●команды, имеющиеся в программном коде, но которые ни разу не выполняются;
●выполняются лишние команды (при заданных входных данных);
●команды выполняются многократно, но неверное количество раз.
Для выполнения программы в пошаговом режиме (в режиме трассировки) используются три команды, которые доступны из меню Debug:
−Команда Step Into (клавиша F11) обеспечивает последовательное, строка за строкой, выполнение программного кода программы (включая содержимое вызываемых методов);
−Команда Step Over (клавиша F10) обеспечивает, как и предшествующая команда Step Into, последовательное выполнение программы, но при этом вызов методов рассматривается как один неделимый шаг (т.е. без перехода внутрь вызываемых методов).
−Команда Step Out (клавиша Shift+F11) обеспечивает выполнение всех оставшихся
строк программного кода текущего выполняемого метода без останова, позволяя выполнить быстрый переход в последнюю точку вызова.
На рис. 15 приведено окно среды разработки в режиме пошаговой отладки. Желтой стрелкой отмечается строка кода, которая будет исполняться по команде Step Into или Step Over.
15
Для выхода из режима пошаговой отладки можно закрыть окно приложения или воспользоваться пунктом меню Debug > Stop Debugging, что иногда предпочтительнее.
Рис. 15. Окно текстового редактора в режиме пошаговой отладки
2.1.5.4. Контрольные точки
Если программный код содержит боле сотни строк, то пошаговое выполнение программы становится утомительным. Упростить процесс пошаговой отладки можно, определив примерное местонахождения ошибки. Предположим, что ошибка находится в последних пятнадцати строчках программы (строки с номерами 20-30). Тогда имеет смысл выполнить большую часть программы в обычном режиме, а режим пошаговой отладки провести только для последних строчек.
Реализовать задуманное можно, используя точки останова или контрольные точки (breakpoints). Контрольная точка ставится в строке с номером 20 (для определения контрольной точки необходимо щелкнуть мышкой на вертикальной полосе слева от нужной строки
программного кода; повторный щелчок отменяет контрольную точку). Затем приложение запускается на исполнение в обычном режиме (пункт меню Debug > Start Debugging).
Первые девятнадцать строчек будут выполняться в обычном режиме, но когда встретится контрольная точка, то программа перейдет в режим пошаговой отладки (см. рис. 16).
16
Рис. 16. Окно текстового редактора в режиме пошаговой отладки, после встречи с контрольной точкой
Необходимо отметить, что в программе может быть установлено несколько контрольных
точек. В этом случае приложение будет останавливаться многократно, а переход между контрольными точками осуществляется по команде меню Debug > Start Debugging.
2.1.5.5. Наблюдение значений переменных
Во время пошаговой отладки программы можно наблюдать значения перемененных. Это позволяет выявить расхождение между текущими и правильными значениями переменных.
Для наблюдения значений переменных в момент останова выполнения программы достаточно расположить указатель мыши на имени переменной – в результате значение переменной появится в виде всплывающей подсказки (пример высветки значения переменной показан на рис. 17).
Дополнительная возможность для наблюдения значений переменных состоит в использовании специальных окон наблюдения:
− Окно Autos отображает значения всех переменных, используемых в текущей и предшествующей строках точки останова программы; в окне отображаются названия переменных, их тип и значения; окно Autos обычно располагается в нижней левой части экрана (см. рис. 17) и
17
для его высветки необходимо щелкнуть мышью на ярлычке с названием окна;
− Окно Locals отличается от предшествующего окна Autos тем, что отображает значения всех переменных текущей области видимости (т.е. переменных текущего выполняемого метода или его локального блока);
Рис. 17. Наблюдение значений переменных
− Окна Watch (таких окон в момент выполнения 4) отличаются тем, что состав отображаемых в них переменных может формироваться непосредственно программистом. Для высветки нужного окна нужно последовательно выполнить команды Debug > Windows > Watch > Watch <N>, где N есть номер высвечиваемого окна. Для добавления переменной в окно для наблюдения нужно указать мышкой необходимую переменную, нажать правую кнопку мыши и появившемся контекстном меню выполнить команду Add Watch (такая же команда может иметься в пункте меню Debug, ее наличие в меню зависит от настроек параметров среды MS Visual Studio 2005). Удобный способ добавления переменных в окна наблюдения состоит в использовании техники "Взять и перенести" (выделить имя переменной, нажать левую кнопку мыши и, не отпуская ее, переместить указатель мыши в окно наблюдения, после чего отпустить конку мыши). Для удаления переменных из окна наблюдения достаточно выделить соответствующую строку и нажать клавишу Delete;
− Близким по назначению к окнам Watch является окно Quick Watch, которое дополнительно позволяет изменять значения наблюдаемых переменных; для высветки окна
18
необходимо выделить нужную переменную и выполнить команду Quick Watch пункта меню
Debug.
2.1.5.6. Пример выполнения отладки
Перечисленных набор средств среды разработки MS Visual Studio 2005 достаточно для организации быстрой и эффективной отладки. Для успешного освоения этих средств необходима понимание принципов отладки и практика по их использованию для поиска и исправления ошибок при разработке достаточно сложных программ.
Приведем пример проведения процесса отладки на примере программы расчета длины окружности и площади круга.
1 |
#include "stdafx.h" |
2 |
#include <conio.h> |
3 |
/* Вычисление длины окружности и площади круга */ |
4 |
|
5 |
int _tmain(int argc, _TCHAR* argv[]) |
6 |
{ |
7float Radius; // радиус окружности
8float Length; // длина окружности
9 float Area; // площадь окружности
10
11// Вводим радиус окружности
12do
13{
14printf("Input Radius: ");
15scanf("%f", &Radius);
16}
17while(Radius < 0);
18
19// Рассчитываем длину окружности и площадь круга
20Length= 2*3.1415*Radius;
21Area= 3.1415*Radius;
22
23// Отображаем длину окружности и площадь круга
24printf("\nRadius= %f\nCircle length= %f\nCircle area= %f", Radius, Length, Area);
25
26// Приостановка окна вывода
27getch();
28
29 return 0;
30}
Листинг программы на языке программирования C++
19
Данная программа не имеет синтаксических ошибок, но выдает неверный результат — площадь круга с радиусом 10 единиц должна быть равна 314.15, а программа выдает 31.415 (см. рис. 18).
Рис. 18. Неверная работа программы
Потенциально имеется три источника ошибок:
1.Неверно введено значение радиуса;
2.Неверно рассчитывается площадь круга;
3.Площадь круга рассчитывается верно, но некорректно отображается сам результат.
Первый случай маловероятен, т.к. длина окружности рассчитывается правильно. Однако на всякий случай значение переменной Radius проверить нужно. Чтобы выяснить где источник ошибки — при расчете результата или при его выводе, нужно проанализировать значение переменной Area сразу после вычисления этого значения. Значение переменной становится известной после выполнения строки с номером 24. Поэтому ставим контрольную точку в строке с номером 24 и наблюдаем значение двух переменных Radius и Area. Как видно из рис. 19 переменная Radius имеет правильное значение, а переменная Area — ошибочное. Следовательно, источником ошибки является выражение в строке с номером 21. Визуальный анализ строчки показывает, что выражение записано неверно, его необходимо скорректировать следующим образом:
Area= 3.1415*Radius*Radius;
20
