рассмотрим на примере небольшой программы вычисления площади треугольника по формуле Герона.
1. |
Компилятор всегда пытается распознать синтаксические конструкции языка. В частности, если после идентификатора
стоит открывающаяся скобка, как в этом примере: P(...), компилятор воспринимает этот идентификатор как имя некоторой пользовательской функции,
в скобках которой должны быть записаны парметры.
В строке сообщений об ошибках видно, что компилятор обнаружил ошибку в 10 строке программы в позиции 13.
Скорее всего, ошибка произошла в этой строке где-то раньше, но ее последствия сказались именно в 13 позиции.
|
2. |
В этом примере компилятор указал на ошибку в стоке 5. Но в этой строке все правильно!
По-видимому, опять ошибка произошла где-то раньше. Идем вверх по тексту программы, пропуская комментарий,
ищем ошибку в предыдущей строке.
|
3. |
Здесь компилятор нашел сразу две ошибки.
Первую ошибку раскрыть несложно: в строке 10 не хватает скобки перед точкой с запятой.
Но в чем же вторая ошибка?
|
4. |
Эту ситуацию с высоты имеющегося опыта разрешить уже просто.
|
5. |
Здесь сразу целая россыпь ошибок! Что же случилось?
Пробуем разобраться в первой ошибке. Она встретилась в 3 строке 5 позиции. Компилятор пытается разобраться с функцией
main(). Ему явно не нравится данная синтаксическая конструкция: то ли это прототип функции, то ли сама функция,
но где ее тело? Поэтому следующие строки с описанием переменных не были разобраны, как следствие переменные оказались
не описаны (undeclared). Отсюда все последующие ошибки.
|
6. |
Эта программы вроде бы прошла компиляцию (Compilation finished), но смущают какие-то сообщения
warning.
Слово warning означает "предупреждение". Компилятор встретил подозрительную ситуацию, на которую обратил внимание программиста,
но тем не менее компиляция прошла успешно. Однако подобные сообщения могут иметь в дальнейшем неприятные последствия. Надо стремиться к тому,
чтобы в программе не было "варнингов".
В нашем примере компилятору не нравится использование фунций printf() и scanf(), он явно не узнает эти функции.
|
7. |
Эта программа прошла компиляцию успешно, без ошибок и предупреждений, дело даже дошло до выполнения программы.
Для вычисления площади треугольника были введены длины сторон: 3, 4, 5. Однако на выходе программа дала
какой-то странный результат значения площади. Очевидно, вычисленное значение S было неправильно преобразовано в форму
внешнего представления.
|
8. |
Программа успешно скомпилирована, запущена на выполнение.
Данные введены, тем не менее, до результата дело не дошло, а появилось сообщение:
Это очень неприятное сообщение, оно свидетельствует о том, что программа пытается залезть в недопустимую область памяти.
Эта ситуция может возникнуть по разным причинам.
Как же это могло произойти в нашем случае? Обратим внимание на функцию scanf().
|
9. |
Программа опять запущена на выполнение.
Данные введены, результат получен:
Но результат какой-то странный. Обозначение
nan расшифровывается как "нет числа" (not a number).
|
10. |
И в заключение, несколько советов
1. |
Программу и команды Makefile
следует набирать очень внимательно. |
2. |
Часто реальная ошибка
заключена не в выделенной строке, а в предыдущей - проверяйте и ее тоже. |
3. | Часто одна ошибка
вызывает еще несколько, и появляются так называемые наведенные ошибки.Отсюда
главное правило отладки - исправлять ошибки последовательно,
возможно, остальные после исправления сами исчезнут. |
|