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

На примере простого приложения с ошибочными операторами выясним, какие сообщения об ошибках и какие предупреждения выдает компилятор. Начните новое приложение, перенесите на форму метку 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, попадем в окно Редактора Кода и увидим в нем код программы с выделенной строкой, около которой стоит зеленая стрелка. Это тот оператор, при выполнении которого произошла ошибка.

Наши рекомендации