|
Программирование >> Аргументация конструирования
Включение одного и того же файла в один модуль встречается чаще, чем вы предполагаете. Бывает, что в файл включается другой файл, в который включается третий, а в него в который включается Это не представляет проблемы, если в .h-файл входят только прототипы функций и определения Sdefine. Считается признаком дурного тона (и часто приводит к серьезным ошибкам) объявлять в подключаемых файлах глобальные переменные или создавать в них функции. Повторных объявлений можно избежать, воспользовавшись директивой #ifdef. Она требует включения всех команд вплоть до если аргумент директивы #ifdef бьш определен ранее (#ifndef действует наоборот- если аргумент не бьш определен). Mylncl-ude . h Проверяем, бьи: а ли использована директ;;ва #define MyModui e h до этого. Если нет, значит включаемый файл во время компхляпии вызывается впервые #ifndef MyModuieh Определим MyModule h с тем, чтобы щэи следующем подклю--;ен;и этого файла из то программы реального вк;:ючения файла не было #define MyModu.Le h Сюда можн мвлять все, что отктг: разместить во включаемом файле накрь-1ие tifndef в конце файла wencif Эта проверка будет проводиться во время компиляции, но не во время выполнения программы. использование cMoHqafuuHbtx tfudcuoje/c С++ Теперь вам должно быть понятно, почему во примерах, приведенных в этой книге, используются директивы # include <.5tdi.o.h> и include <io:=treaii?.. h>. Эти подключаемые файлы содержат объявления всех используемых в программах стандартных функций. Обратите внимание, что имена стандартных . h-файлов заключены в угловые скобки, тогда как при объявлении локальных .h-файлов используются обычные кавычки. Единственное отличие между этими типами объявлений состоит в том, что С++ начинает искать файлы, заключенные в обычные кавычки, в текущем каталоге (каталоге проекта), а поиск файлов, заключенных в угловые скобки, происходит в предопределенных каталогах, содержащих подключаемые файлы. С помощью настроек проекта программист может определить, где именно должен проводиться поиск включаемых файлов. Гл11 ла эгра на C++ /3 эной главе... Определение типа ошибки Использование отладочной печати V Использование отладчика Первая программа BUDGET 5е часто случается (особенно с чайниками ), что программа идеально работает с первого раза. Крайне редко удается написать нетривиальную программу и не допустить ни одной ошибки. Чтобы избавиться от ошибок, можно пойти двумя путями. Первый - стирание программы и написание ее заново, а второй - поиск и исправление ошибки. Освоение первого пути я оставляю читателю, а в этой главе расскажу о том, как выследить и исправить ошибку в программе. OnfteqexeHue tautaouiuJ/cu Можно выделить два типа ошибок: те, которые компилятор может найти, и те, которые не может. Первый тип называют ошибками компиляции (compile-time error). Их довольно легко найти, поскольку компилятор сам указывает место в программе, где встретилась ошибка. Правда, иногда описание ошибки бывает не совсем точным (компьютер так легко сбить с толку!), однако, зная капризы своего компилятора, нетрудно разобраться в его жалобах. Ошибки, которые компилятор не может найти, проявляются при запуске программы и называются ошибками времени исполнения (run-time error). Их найти намного труднее, поскольку, кроме сообщения об ошибке, нет и намека на то, какая именно ошибка возникла и где (сообщения, которые генерируются при возникновении ошибок выполнения, вполне достойны звания ошибочных). Для выявления жучков в программе обычно используется два метода. Первый - добавить отладочные команды, выводящие ключевые значения в ключевых точках программы. Увидев значения переменных в месте возникновения ошибки, можно понять, что именно неправильно в данной программе. Второй метод заключается в использовании специальной программы - отладчика. Отладчик позволяет отслеживать процесс выполнения программы. использование oifucufOHHOU печхипи Добавление команд вывода в ключев1х точках помогает понять, что происходит в программе, и называется методом отладочной печати (иногда именуемым WRITE). Метод WRITE появился во времена, когда программы писались на языке FORTRAN, в котором вывод осуществляется с помощью команды WRITE. Приведенная ниже дефектная программа наглядно демонстрирует применение отладочных команд. Эта программа должна считывать последовательность чисел с клавиатуры и выводить их среднее арифметическое значение. Однако она не делает поскольку содержит две ошибки, одна из которых вызывает аварийный останов, а вторая приводит к неправильному результату. - эта программа усредняла бы ряд чисел, если бы не содержала одну невыполнимою ошибку iinciude <stdio.h> #include <iostream.h> int main(int argc, char* pszArgs[]) { cout << Эта программа содержит ошибки!\n ; аккумулирует ряд чисел, пока ватель не введет отрицательное число, после чего выводит int nSum.; for (int = 0; ; ) ждет ввода следующего числа int nValue; cout << следующее cin >> nValue; если введенное число меньше нуля.. . if {nValue < 0) вывести среднее cout \пСреднее равно: << << \п ; break; если числ адьше нуля, сложить его с аккумулятором nSum += nValue; return 0; После ввода этой программы создайте выполнимый файл (клавиша <F9>). Запустите эту программу и введите числа 1, 2 и 3, а затем -1. Вы ожидаете увидеть, что их среднее равно двум? Вместо этого очевидного результата будет выдано довольно непривлекательное сообщение об ошибке, показанное на рис. 11.1. Выявление жучка № 1 Сообщение об ошибке, приведенное на рис П.1, выглядит весьма внушительно. На самом деле большая часть информации в этом сообщении бесполезна для нас (как и для многих других). Но во второй строке есть намек на источник ошибки: Division by zero at ... (деление на ноль в . . .). Как можно понять, вовремя выполнения программы произошла попытка деления какой-то переменной на ноль (крайне информативно, не правда ли?). Определить источник ошибки не так уж
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |