Сообщения компилятора и компоновщика
На примере простого приложения с ошибочными операторами выясним, какие сообщения об ошибках и какие предупреждения выдает компилятор. Начните новое приложение, перенесите на форму метку Labelи кнопку Button. В обработчик щелчка кнопки введите следующие операторы:
void _fastcall TForm1::Button1Click(Tobject *Sender)
{
int i,j;
double A;
for(i=0; i<50;i++)
A*=10000; //Увеличение A в 10000 раз
Label1->Caption = “A = “ +B;
}
Установите режим, наиболее удобный для отладки, при котором компилятор отображает все свои замечания. Для этого в окне опций проекта, вызываемом командой Проект|Опции на странице Компилятор в группе опций Предупреждения, нужно включить опцию Все. Затем выполните команду Запуск|Запустить или нажмите соответствующую быструю кнопку, или нажмите клавишу F9.
Внизу окна Редактора Кода появятся сообщения о замечаниях и ошибках. Первое сообщение:
[C++ Warning] Unit1.cpp (23): W8013 Possible use of ‘A’ before definition
([C++ Предупреждение] модуль Unit1.cpp, строка 23: W8013 Переменная ‘A’, возможно, используется до того, как ей присвоено значение)
Это предупреждение о том, что переменная A не инициализирована и ее значение к моменту первого выполнения оператора в строке 23 не определено. Чтобы узнать, что это за строка, нужно дважды щелкнуть на этом предупреждении. В окне Редактора Кода выделится соответствующая строка:
A*=10000; //Увеличение A в 10000 раз
Следовательно, объявление переменной нужно изменить так:
double A=1;
Чтобы в переменной A накапливался результат при каждом щелчке на кнопке, сделаем ее глобальной.
Перейдем к второму сообщению компилятора:
[C++ Error] Unit1.cpp (24) : E2451 Undefined symbol ‘B’
([C++ Ошибка] модуль Unit1.cpp, строка 24: E2451 Необъявленный идентификатор ‘B’)
Это уже сообщение об ошибке. В операторе
Label1->Caption = “A = “ +B;
вместо переменной A указана переменная B, которая не была объявлена. Строка кода с этой ошибкой выделена в окне Редактора Кода, и курсор остановился около необъявленного идентификатора.
Поскольку ошибка неисправима, выполняемый модуль не формируется и приложение не выполняется.
Третье сообщение компилятора:
[C++ Warning] Unit1.cpp (25): W8080 ‘j’ is declared but never used
([C++ Предупреждение] модуль Unit1.cpp, строка 25: W8080 Переменная ‘j’ объявлена, но нигде не используется)
Объявление переменной j как ненужной нужно удалить из текста.
Последнее сообщение компилятора:
[C++ Warning] Unit1.cpp (25): W8057 Parameter ‘Sender’ is never used
([C++ Предупреждение] модуль Unit1.cpp, строка 25: W8057 Параметр ‘Sender’ нигде не используется)
Параметр Sender передается в обработчик событий и является компонентом, в котором произошло событие. В данном обработчике он не нужен, поэтому это предупреждение можно игнорировать.
Итак, приложение не откомпилировалось из-за ошибки с использованием необъявленной переменной B.
После исправления в ошибочном операторе переменной Bна A появится новое сообщение об ошибке:
[C++ Error] Unit1.cpp (24) : E2060 Illegal use of floating point
([C++ Ошибка] модуль Unit1.cpp, строка 24: E2060 Недопустимое использование плавающей точки)
В правой части оператора Label1->Caption = “A = “ +A;
складываются строка “A =“ и переменная с плавающей точкой A. Это ошибка использования несовместимых типов.
После всех исправлений код примет вид
double A=1;
void _fastcall TForm1::Button1Click(Tobject *Sender)
{
int i;
for(i=0; i<50;i++)
A*=10000; //Увеличение A в 10000 раз
Label1->Caption = “A = “ + FloatToStr(A);
}
Теперь откомпилируем приложение и выполним его.
Действия в случае ошибки выполнения
Щелкнув на кнопке, убедимся, что приложение работает. Однако при повторном щелчке выполнение прерывается. Щелкнув по закладке Unit1.cpp, увидим окно с сообщением отладчика, которое после перевода выглядит так: “Проект Project1.exe вызвал генерацию исключения класса EOverflow с сообщением ‘Переполнение при операции с плавающей запятой’. Процесс остановлен. Используйте команды Step или Run для продолжения”.
Это сообщение об ошибке, приведшей к генерации исключения. Исключения (exceptions) генерируются при различных ошибках – исключительных ситуациях.
Щелкнув на кнопке OK, попадем в окно Редактора Кода и увидим в нем код программы с выделенной строкой, около которой стоит зеленая стрелка. Это тот оператор, при выполнении которого произошла ошибка.