Как исправить ошибки в программе

рассмотрим на примере небольшой программы вычисления площади треугольника по формуле Герона.

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.  

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