Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом Voldem@r / Оно / ПЗ_release.doc
Скачиваний:
49
Добавлен:
16.04.2013
Размер:
1.6 Mб
Скачать

2.1.3. Применение библиотек stl и mfc в программе

В разработанном программном комплексе из библиотеки шаблонов STL были использованы такие контейнеры, как вектор (vector) и ассоциативный массив (map).

Контейнер vector очень хорошо подошёл для организации хранения элементов модели. Хранение каждой разновидности элементов модели было организовано в отдельном векторе. Это позволило облегчить поиск нужного элемента. Кроме того, при перерисовке окна нужно отобразить на экране пиктограммы всех элементов модели, что легко сделать в нескольких циклах (отдельный цикл для своей разновидности элементов) за счёт использования контейнера vector.

Контейнер map использовался лишь для одной цели: хранить соответствие между именем переменной и её текущим значением. В принципе, такое хранение можно было бы организовать и с помощью контейнера vector, однако интерфейс класса std::map содержит все необходимые функции, которые были необходимы для манипулирования информаций о переменных и их значениях.

Количество классов из библиотеки MFC, использованных в программе, значительно больше количества классов из библиотеки STL. И это неудивительно. Во-первых, весь интерфейс реализован с помощью таких классов библиотеки MFC, как CWinApp, CDialog, CFrameWnd, CMenu, CButton, CEdit, CcomboBox и других. Во-вторых, в программе активно использовался класс CString, т.к. практически вся информация о модели хранится в виде строк (имена элементов, описания различных параметров, формульные зависимости и т.д.). И, в-третьих, были использованы классы CFileDialog, CFile, CTime, обеспечившие простую и удобную работу с файлами.

2.1.4. Средство ClassWizard

Как было сказано выше, программа разрабатывалась с использованием немалого количества классов из библиотеки MFC. Основную работу по созданию и манипулированию этими классами берёт на себя Мастер Классов (ClassWizard). Мастер классов является интегрированным в Visual Studio C++ 6.0 средством. Средство ClassWizard предоставляет широкий спектр услуг [8]:

  1. создание нового класса. При помощи ClassWizard можно добавить новый класс, созданный на основе базовых классов. В качестве базового можно использовать классы, наследованные от CCmdTarget или CRecordset. Для наследования классов от других базовых классов использовать средства ClassWizard нельзя. Такие классы надо создавать вручную, непосредственно в текстовом редакторе. Объекты, порожденные от класса CCmdTarget, могут обрабатывать сообщения Windows и команды, поступающие от меню, кнопок, акселераторов. Полученная заготовка класса является полностью работоспособной. Её можно дополнить по своему усмотрению новыми методами и данными. Эту работу можно выполнить вручную, но гораздо лучше и проще воспользоваться услугами ClassWizard. За счет использования ClassWizard процедура создания собственного класса значительно ускоряется и уменьшается вероятность совершить ошибку во время объявления методов;

  2. включение в класс новых методов. Очень удобно использовать ClassWizard для включения в состав класса новых методов. Можно добавлять к классу методы, служащие для обработки сообщений Windows и команд от объектов, а также методы, переопределяющие виртуальные методы базовых классов. ClassWizard не только позволяет добавить в класс новые методы, но и удалить их. ClassWizard самостоятельно удалит объявление метода из класса (но не реализацию метода);

  3. включение в класс новых элементов данных. ClassWizard позволяет включать в класс не только новые методы, но и элементы данных, связанные с полями диалоговых панелей, форм просмотра и форм для просмотра записей баз данных и полей наборов записей. ClassWizard использует специальные процедуры, чтобы привязать созданные им элементы данных класса к полям диалоговых панелей. Эти процедуры носят названия "обмен данными диалоговой панели" и "проверка данных диалоговой панели" (Dialog Data Exchange and Dialog Data Validation - DDX/DDV). Чтобы привязать поля из наборов записей к переменным, используется процедура обмена данными с полями записей (Record Field Exchange - RFX). Процедуры DDX/DDV и RFX значительно упрощают программисту работу с диалоговыми панелями. Они позволяют связать поля диалоговых панелей и переменные. Когда пользователь редактирует поля диалоговых панелей, процедуры DDV проверяют введенные значения и блокируют ввод запрещенных значений. Затем процедуры DDX автоматически копируют содержимое полей диалоговых панелей в привязанные к ним элементы данных класса. И наоборот, когда приложение изменяет элементы данных класса, привязанные к полям диалоговой панели, процедуры DDX могут сразу отобразить новые значения полей на экране компьютера.

Внешний вид средства ClassWizard показан на рис. 2.1.

Рис 2.1 Средство автоматизации разработки ClassWizard

2.2. Методы отладки и тестирования программ в среде Visual C++

С точки зрения тестирования, программные продукты имеют некоторые характерные особенности. Например, не существует полностью определённого эталона, которому должны соответствовать все результаты тестирования проверяемого программного обеспечения. Кроме того, принципиально невозможно построить тестовые наборы, достаточные для полной проверки программного обеспечения. Всё это затрудняет процесс тестирования программ. Поэтому тестирование проводится в объемах, минимально необходимых для проверки программ.

2.2.1. Инструментальные средства отладки среды Microsoft Visual Studio C++

Среда разработки Microsoft Visual Studio C++ предоставляет различные инструменты, позволяющие быстро и эффективно находить ошибки в исходном коде программы [5]. Визуальный интерфейс отладчика включает в себя специальные меню, окна, панели диалогов и поля «электронных бланков». Можно даже пользоваться удобной формой операции Windows типа “drag&drop” («перетащить и бросить») для обмена информацией между компонентами отладчика.

Отладка приложения начинается с запуска его с помощью одного из пунктов меню Build | Start Debug (рис 2.2)

Рис 2.2. Меню Build | Start Debug

В таблице 2.1 описаны все пункты меню Start debug и приведены соответствующие им горячие клавиши. Применение горячих клавиш позволяет сэкономить время, затрачиваемое на отладку приложения.

Таблица 2.1

Команда

Действие

Клавиши

Go

Запускает отладчик и/или исполняет программу (с обычной скоростью выполнения), пока не встретится котрольная точка или конец программы, либо она будет остановлена для пользовательского ввода. Аналогична кнопке Go панели инструментов.

F5

Step Into

Запускает отладчик и/или исполняет программу в пошаговом режиме. Когда текущим оператором является вызов функции или метода, отладчик входит внутрь соответствующей процедуры.

F11

Run to Cursor

Запускает отладчик и/или исполняет программу до строки, в которой установлен текстовый курсор. Команду можно применять в качестве альтернативы установки обычной контрольной точки.

CTRL+F10

Attach to Process

Прикрепляет отладчик к уже работающему процессу. После этого можно приостановить процесс и отлаживать его, как обычно. Этот пункт меню очень полезен при отладке сервисов.

Процесс отладки начинается с того, что программа компилируется из исходных текстов и запускается на исполнение. При этом во время компиляции могут возникнуть предупреждения (warnings) и ошибки (errors). Ошибки, которые обнаруживает компиоятор, являются синтаксическими, и без их устранения запуск программы невозможен. Предупреждения комилятора тоже важны и иногда способствуют обнаружению логических ошибок. Например, случайно поставленная точка с запятой после объявления цикла перед его телом. В этом смысле предупреждающие сообщения компилятора даже важнее сообщений об ошибках (при наличии ошибок программа не запустится вовсе, а вот если проигнорировать предупреждения, то потом можно очень долго искать место логической ошибки).

В этом начальном меню отсутствует ещё одна важная команда – Step Over. Эта команда позволяет отлаживать программу в пошаговом режиме без входа внутрь вызовов процедур.

Когда начинается отладка приложения любым из описаных выше способов, по умолчанию на экране появляется инструментальная панель отладчика (рис. 2.3).

Рис. 2.3. Панель инструментов Debug

Кратко опишу назначение элементов этой панели (слева направо):

  1. Restart – перезапустить программу в отладочном режиме с самого начала;

  2. Stop Debugging – завершает отладку приложения. После этого можно вносить изменения в проект (редактировать код, добавлять или удалять файлы в/из проекта);

  3. Break Execution – приостанавливает исполнение программы и позиционирует курсор на текущей инструкции;

  4. Apply Code Changes, Edit and Continue – позволяет зафиксировать изменения в коде, сделанные во время отладки приложения, и продолжить выполнение программы. Эта функция полезна при исправлении незначительных ошибок (например, арифметических выражений), обнаруженных в процессе отладки. При этом нет надобности перезапускать программу с самого начала – сделанные изменения вступают в силу немедленно;

  5. Show Next Statement – показывает следующий оператор программного кода. Если исходный код недоступен, то показывается оператор в окне дизассемблера;

  6. Step Into – осуществляет «шаг» трассировки с заходом внутрь функций;

  7. Step Over – осуществляет «шаг» трассировки без захода внутрь функций;

  8. Step Out – выполняет текущую функцию до конца на полной скорости;

  9. Run To Cursor – выполняет программный код на полной скорости до позиции, в которой находится текстовый курсор;

  10. Quick Watch – открывает окно, в котором можно просмотреть значения переменных;

  11. Watch – открывает окно, в котором отображается переменные приложения по их именам, а также выбранные выражения;

  12. Variables – открывает окно с информацией о переменных текущего и предыдущего операторов, а также возвращаемые функциями значения, локальные переменные текущей функции и объект, на который указывает this;

  13. Registers – открывает окно, отображающее регистры общего назначения и состояние флагов процессора;

  14. Memory – отображает содержимое памяти программы;

  15. Call Stack – открывает окно стека вызовов, в котором перечисляются вызванные и незавершённые к данному моменту процедуры;

  16. Disassembly – показывает код ассемблера, полученный в результате дизассемблирования компилированной программы.

Остановлюсь немного подробнее на окне Quick Watch. Это окно полезно для просмотра значений переменных и выражений. В этом окне можно просматривать значения не только переменных простых типов (например, int), но и таких, как массивы, структуры, объекты классов. Особенностью окна Quick Watch является применение так называемых форматирующих символов [8]. Эти символы позволяют изменять формат представления переменных. Форматирующие символы пишутся после имени переменной через запятую. Примеры форматирующих символов: c – интерпретирует значение переменной, как одиночный символ, s – интерпретирует значение переменной, как строку, Hr – отображает переменную в виде кода ошибки Windows (в символьном виде. Пример – S_OK).

При оисании команд отладчика упоминалась контрольная точка или точка останова. С помощью данного механизма выполнение программы можно прервать в определённом месте. Например, если есть подозрение, что какая-то функция работает неправильно, то можно поставить контрольную точку в теле этой функции и запустить программу на исполнение. При первом вызове исследуемой функции отладчик приостановит выполнение программы на том месте, в котором установлена контрольная точка. Затем можно протрассировать фунцию по шагам для обнаружения ошибки. Контрольные точки удобны тем, что до места установки контрольной точки программа выполняется с обычной скоростью. Эта особенность крайне полезна в случаях, когда место, в котором установлена контрольная точка, находится далеко от начала программы и добраться до него по шагам – значительная трата времени. Кроме того, функция с установленной контрольной точкой может вызываться лишь при выполнении каких-нибудь условий. В этом случае вручную добраться до нужного места будет также крайне нелегко. На рис. 2.4 показан пример установленной контрольной точки.

В среде Microsoft Visual Studio C++ есть возможность управления контрольными точками всего проекта. При выборе пункта Breakpoints меню Edit появляется диалоговое окно, содержащее список всех контрольных точек (рис 2.5).

Рис. 2.4 Пример использования контрольной точки при отладке приложения

Рис. 2.5 Диалог управления контрольными точками

Из этого окна можно удалить все или некоторые контрольные точки, временно отключить их или установить условия срабатывания для каждой контрольной точки. Условие срабатывания позволяет прерывать выполнение программы только в том случае, когда оно истинно. Например, если контрольная точка установлена в теле цикла, то программа будет прерываться на каждой итерации. В качестве условия можно задать остановку на каждой пятой итерации (рис 2.6).

Рис. 2.6 Условие остановки в контрольной точке

Ещё одним средством, обеспечивающим эффективную отладку, является возможность изменения значений переменных. Предположим, что функция вернула не то значение, которое ожидалось. В результате проверки этого значения выполнение программы прекращается (срабатывает условие выхода). Можно, конечно, перезапустить приложение, зайти внутрь функции и по шагам пройти её тело в поисках ошибки. И это, несомненно, необходимо сделать. Однако сначала можно убедиться, что при ожидаемом значении, возвращённом функцией, программа отработает правильно до конца. Для этого можно в отладчике «подменить» результат и запустить программу дальше на исполнение. Данный способ также хорошо подходит для обеспечения выхода из «зациклившихся» циклов.

Если в процессе отладки была обнаружена логическая ошибка, то можно прервать отладку нажатием клавиш SHIFT+F5. После этого исполнение программы прекратится и можно вносить в код изменения.

Соседние файлы в папке Оно