Глава 3. Сообщения об ошибках и предупреждения.

- Как вам yдалось так быстpо выyчить английский язык?!!
- Да, еpyнда какая. Они там почти все слова из С++ взяли.
(Из разговора с программистом)

Но не всегда Вы будете видеть радующее глаз сообщение, подобное представленному на рис.2.19. А может, Вы уже и столкнулись с этим, выполняя написанное в предыдущей главе. Если Вам тогда повезло, то теперь вернемся к нашему файлу "2000dlgc.cpp" и внесем туда ошибку.

3.1. Сообщения об ошибках.

Удалим, например, первые кавычки во фразе "Вы нажали:".

MessageBox(Вы нажали на кнопку\nСпасибо Вам за это!",

Ага, текст изменил цвет и из синего стал красным. (Если вы читаете черно-белый вариант книги, то это превращение я Вам показать, конечно, не могу - смотрите на монитор). Не стану объяснять очевидное - красный цвет всегда означает что-то плохое. Таким незамысловатым образом Borland, следящий за каждым Вашим движением, сразу сообщает Вам, что Вы делаете что-то не то.

Вернем кавычки на место и удалим первую запятую.

MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!"
"Наше сообщение", MB_OK | MB_ICONINFORMATION);

Теперь Borland сразу не отреагировал - это не такая тривиальная ошибка, как первая. Но он ее все равно обнаружит. Нажмем на кнопку "Compile". Получим следующее - см.рис.3.1.

Рисунок 3.1. Неудачное завершение компилляции.

Статус уже не "Success" ("успешно"), а "Failure" ("неудачно"). И в строке "Errors" ("Ошибки") вместо приятных нулей теперь горит число "2". Не думайте, кстати, что Вы успели сделать две ошибки. Нажимаем на "ОК" - что ж еще делать-то - и активным окном становится окно внизу с заголовком "Messages" ("Сообщения"). В этом окне Вам сразу сообщают о Ваших ошибках - см.рис.3.2.

Рисунок 3.2. Сообщения об ошибках.

Как всегда, красный цвет - восклицательного знака - означает что-то нехорошее. Бывают и другие цвета, кроме красного, о чем мы узнаем позже. Собственно, сообщение об ошибке чаще всего для новичка выглядит очень загадочным, но это только на первый взгляд. Прежде чем пытаться перевести его, заметим, казалось бы, более важную вещь - указание на место ошибки. Во-первых, видно, что оба сообщения об ошибках - оба красных восклицательных знака указывают на одно место - на позицию 48 строки 60 файла "2000dlgc.cpp" (60,48). То, что место одно, говорит, обычно, о том, что ошибка одна. Просто Borland оценил ее с двух точек зрения. Во-вторых, обязательно учитывайте, что Borland указывает не ТОЧНОЕ место ошибки - поскольку правильных вариантов может быть много, Borland не знает, ЧТО Вы хотели написать на самом деле. Итак, позиция, чаще всего стоит ПОСЛЕ места ошибки. И даже нельзя быть уверенным, что ошибка находится в указанной строке. В чем же можно быть уверенным? Да ни в чем! Щелкнем на выделенной строке в окне "Messages", и мы сразу же перенесемся в ПРЕДПОЛАГАЕМОЕ место ошибки. И окажемся перед точкой с запятой в конце команды "MessageBox", на основании чего можно предположить, что ошибка находится в этой команде. Где именно? Подсказка, вообще-то, была - во втором сообщении об ошибке, которое из-за своей длины не убралось на рис.3.2. Полный текст сообщения выглядел так:

Error:  2000dlgc.cpp(60,48):Type mismatch in parameter 'caption'
in call to 'TWindow::MessageBox(const char *,const char *,unsigned
int)'

Здесь Borland среди всего прочего напоминает Вам, каким должен быть синтаксис команды "MessageBox". Взлянув внимательно и сравнив с нашим текстом, мы увидим, что количество запятых отличается. К сожалению, не всегда это бывает так просто - в команде могут быть необязательные параметры - т.е. такие, которые можно не указывать - тогда количество запятых в реальном коде может быть меньше, чем в описании синтаксиса. Но проверять такие вещи стоит. Более точное предполагаемое место ошибки можно увидеть в начале сообщения - а именно - что-то не так с "параметром 'caption'" - т.е., с заголовком программы - и искать надо где-то около текста "Наше сообщение", что соответствует действительности - именно перед заголовком не хватает сейчас запятой.

Если же простое чтение сообщений об ошибках не дает Вам идеи о ее сути, и опознать в тексте файла Вы ее тоже не можете, попробуйте почитать HELP. Там есть раздел, который называется "Error messages". Иногда там действительно можно найти подробности, помогающие устранить ошибку. Собственно, можно даже в подобной ситуации не запускать Help отдельно, а просто выделить сообщение об ошибке, нажать правую кнопку мыши и в появившемся меню выбрать "Help".

Да, запятая оказалась не такой простой ошибкой. Возьмем что-либо попроще. Запятую вернем на место, а удалим последнюю скобку -

MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!",
"Наше сообщение", MB_OK | MB_ICONINFORMATION;

После компилляции мы получим сообщение об одной ошибке и Borland четко укажет на нее:

Error:  2000dlgc.cpp(60,48):Function call missing )

Редкий случай, когда, нажав на сообщение об ошибке, мы попадаем почти на ее место - в одной позиции от нее, да еще и все ясно - "В вызове функции пропущен знак 'скобка'" - что-что, а скобки Borland считать умеет!

И давайте посмотрим еще на один тип ошибки, который возникает, когда Вы долго и упорно отлаживаете программу - редактируете, компиллируете, запускаете - и все это много раз по кругу. Запустим нашу программу не командой "Run", а просто из ее папки - там всегда есть какая-то работоспособная версия. Не закрывая программы вернемся в Borland, удалим все ошибки, нажмем "Build". Что получим - снова ошибку - см.рис.3.3.

Рисунок 3.3. Билдинг не удался.

Сообщение об ошибке будет иметь следующий вид - см.рис.3.4.

Рисунок 3.4. "Не могу открыть файл 2000.exe"

От чего произошла эта ошибка, Вы уже догадались - Borland попытался создать новый вариант программы "2000.exe" в тот момент, когда эта программа была запущена. И он об этом догадался, написав в скобках - "Программа все еще работает?" Вывод - всегда закрывайте создаваемую Вами программу, когда создаете ("Make", "Build") новый вариант.

3.2. Предупреждения.

На рис.3.1 и 3.3 у нас всегда были нули в строке "Warnings" ("Предупреждения"). Давайте теперь с ними познакомимся. Добавим в наш код новую строку:

void T2000DlgClient::BNClickedOne()
{
  // INSERT>> Your code here.
  MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!",
  "Наше сообщение", MB_OK | MB_ICONINFORMATION);
  int a;
}

Что получим после компилляции - см.рис.3.5.

Рисунок 3.5. Предупреждения.

Ошибок в коде нет, о чем говорит, как ноль в строке "Errors", так и статус - "успешно". Но появилось 1 предупреждение ("Warnings"). Предупреждение указывает Вам на нечто, что не мешает программе правильно откомпиллироваться, но что вызывает у Borlanda некоторые сомнения. Что же это в данном случае? Читаем сообщение, помеченное в этом случае желтым восклицательным знаком:

Warn :  2000dlgc.cpp(64,2):'a' is declared but never used

Означает это, что переменная "a" объявлена в тексте программы, но нигде - ни в какой команде не используется. Такие вещи иногда случаются, если Вы долго пишете большую программу, вводите переменные, потом отказываетесь от них. Самое безобидное предупреждение - если Вас не раздражает 1 в строке Warnings, то можете все оставить, как есть. Кстати, бывает, что такое предупреждение Borland выдает несправедливо - видимо, не все он сам в себе понимает правильно.

В общем, на предупреждения следует обращать внимание, и исходя из правил хорошего тона, надо подчищать программу, чтобы предупреждений не было. Но не стоит затрачивать много усилий на их устранение, если Вы считаете, что какие-то предупреждения не принесут вреда.

Галявов И.Р. e-mail: cborland@mail.ru

Назад | Содержание | Вперед