Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование в среде ВС++.doc
Скачиваний:
10
Добавлен:
09.11.2018
Размер:
3.52 Mб
Скачать

1.5. Сообщения компилятора и компоновщика

Внесём в программу три ошибки (рис. 5):

  • int x, y, K, sum, pr; // символ z заменим на К

  • scan( "%d%d%d", &x, &y, &z); // из слова scanf уберём букву ‘ f ’.

  • sum = x + y // уберём символ ‘;’ – конец оператора

Рис. 5. Сообщения компилятора об ошибках в программе и предупреждения

Установите режим при котором компилятор отображает все свои замечания: М_Project -> Options… (Проект|Опции) -> окно опций проекта -> вкладка Compiler (Компилятор) -> в группе опций Warnings (Предупреждения) включить опцию All (Все). Затем выполните команду Запуск кл_F9.

Внизу окна Редактора Кода появятся сообщения о замечаниях и ошибках (рис. 5) Перевод сообщений на русский язык:

  1. [C++ Ошибка] модуль Program1.cpp строка 19: Е2268 Вызов неопределённой функции ‘scan’;

  2. [C++ Ошибка] модуль Program1.cpp строка 19: Е2451 Необъявленный идентификатор ‘z’;

  3. [C++ Ошибка] модуль Program1.cpp строка 22: Е2379 Отсутствующий оператор;

  4. [C++ Предупреждение] модуль Program1.cpp строка 25: W8013 Переменная ‘pr’ возможно используется до того как ей присвоено значение;

  5. [C++ Предупреждение] модуль Program1.cpp строка 28: W8080 Объявленный идентификатор ‘К’ нигде не используется.

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

Ошибки 1 и 2 и предупреждение 5 легко обнаружить по соответствующим сообщениям. Двойной щелчок на сообщении 3 выделяет строку sum = sum + z; и курсор указывает оператор присваивания ‘=’. При отсутствии символа ‘;’, указывающего конец оператора sum = x + y, компилятор рассматривает строки “sum = x + y” и “sum = sum + z;” как одну строку “sum = x + y sum = sum + z;” , в которой между идентификаторами ‘y’ и ‘sum’ нет знака операции.

Предупреждение 4 о том что переменная ‘pr’ не инициализирована и ее значение для вывода в строке 25 не определено

Задание: исправьте по порядку все ошибки и проверьте правильность работы программы

1.6. Действия в случае ошибки выполнения

В вычислительной математике часто встречаются ошибки Деление на ноль или Переполнение.

Для изучения ошибки Деление на ноль модифицируйте программу: строку ”pr = x * y * z; ” замените строкой ”pr = x * y / z; ” и выполните программу при z=0.

В окне отладчика Debugger Exception Notification (рис. 6) видим сообщение об ошибке приведшей к генерации исключения Исключения (exceptions) генерируются при различных ошибках – исключительных ситуациях Cообщение отладчика после перевода выглядит так: “Проект Project_MU1.exe вызвал генерацию исключения класса EDivByZero с сообщением ‘Деление на ноль’. Процесс остановлен Используйте команды Step или Run для продолжения”.

Щелкнув на кнопке OK попадем в окно Редактора Кода и увидим в коде программы выделенную строку около которой стоит зеленая стрелка B операторе этой строки произошла ошибка

Нажав кл_Ctrl+F2, прерываем выполнение программы Так поступают в случае когда понятно где ошибка и как ее исправить Если же ошибка непонятна то прежде чем прервать сеанс работы с приложением надо получить дополнительную информацию о состоянии переменных те провести отладку

Рис. 6. Выполнение программы с ошибкой Деление на ноль

Д алее попытаемся получить сообщение об ошибке переполнения с целочисленными данными типа int (диапазон от -32768 до +32767). Вернитесь к исходному коду программы (рис. 3) и выполните пуск с данными 10, 100, 1000, для которых значение переменной pr=106 > 32767. Результат получается правильный (рис. 7) типа long int (-231 …231 -1).

На рис. 8 показаны результаты с исходными данными 104 , 104 , 104 . Произведение чисел должно быть равно 1012, однако результат – отрицательное число – неправильный и нет сообщения об ошибке приводящей к генерации исключения. При вычислениях с целочисленными данными об этом нужно помнить!

Рис. 7. Окно Output, анализ переполнения диапазона данных типа int

Рис. 8. Окно Output, переполнение диапазона данных типа long int

Задание: выполните программу с другими наборами входных данных и проанализируйте результаты.

Продолжим рассмотрение темы Переполнение для вещественных чисел типа float (по абсолютной величине от 3.4Е-38 до 3.4Е+38). Дополните код программы строками:

float a = 1E+20, b;

b = a * a;

printf( " float a = %e b = %e \n", a, b);

Переменная b должна иметь значение 1040 > 3.4Е+38, поэтому после пуска программы на экране появится окно с сообщением отладчика о генерации исключения класса EOverflow: ‘Переполнение при операции с плавающей запятой’… (рис. 9). Щёлкните кн_ОК и остановите выполнение программы кл_Ctrl + F2.

Р ис. 9. Переполнение в выражении с данными типа float

Задание: выполните пуск программы для следующих значений переменной а: 1Е+10, 1Е-10 и 1Е-20. Найдите значение а, при котором значение b будет равно нулю. Сделайте выводы о работе программы.

СПРАВОЧНАЯ СЛУЖБА

Составной частью среды BC++ 3.1 является встроенная справочная служба (на английском языке). Полный перечень разделов и направлений поиска нужной информации приведён в меню Help. Нажатием клавиши F1 можно получить справку, зависящую от текущего состояния среды (контекстно-зависимая справка). Например, если нажать F1 в момент, когда среда обнаружила ошибку в программе, в справке будут сообщены дополнительные сведения о причинах появления этой ошибки и рекомендации по её устранению.

Существуют четыре способа обращения к справочной службе из окна редактора: F1 – получение контекстно-зависимой справки, Shift+F1 – выбор справки из списка доступных справочных сообщений, Ctrl+F1 – получение справки о нужной функции, о константе или переменной и других объектах языка С++, Alt+F1 – получение предыдущей справки.

При использовании команды Shift+F1 на экране появляется справочное окно, содержащее в алфавитном порядке список объектов. Чтобы получить справку, нужно переместить указатель к нужному слову (объекту) и нажать клавишу Enter.

Эту же справку можно получить по-другому: напечатать на экране имя объекта или подвести курсор к имеющемуся уже в тексте в программы стандартному имени и нажать кл_Ctrl+F1.