Огромную роль в программировании играет процесс отладки программ, а потому данная тема не зря нами затронута и должна быть подробно рассмотрена. Если при отладке программы возникла ошибка, вы должны знать, как её исправить. Можно хорошо знать язык программирования, но не знать как исправить случайно появившуюся ошибку. В итоге — неграмотно потраченное время на отлавливание ошибок и не законченная программа. Ошибки делают все, начинающие и даже самые искусные программисты, это лишь дело времени. Чаще всего ошибки появляются из-за не внимательности, где-то запятую пропустили или не поставили скобочку и т.д. Но даже такие банальные ошибки необходимо отлавливать и исправлять. Данная статья не является набором правил для отладки программ, моя цель — ввести Вас в суть проблемы и дать несколько рекомендаций, которые позволят вам сэкономить драгоценное время.
Есть два типа ошибок:
- синтаксические ошибки — ошибки, которые компилятор может отловить при сборке проекта. Хотя уже сейчас такого типа ошибки компилятор отлавливает ещё до сборки проекта.
- ошибки времени выполнения, эти ошибки не всегда легко определить. Проект будет собран компилятором, и даже на первый взгляд нормально работать.
Ошибки времени выполнения появляются при определённых условиях (частные случаи). В силу того, что эти ошибки отлавливаются во время работы программы, а не при компиляции, они имеют такое название.
Рассмотрим несколько простых примеров, в которых специально допустим по одной ошибке.
// синтаксическая ошибка int main( // специально пропущена закрывающая скобочка main функции { return 0; }
Компилятор должен сгенерировать ошибку типа:
Тут всё предельно ясно, кстати в сгенерированном сообщении об ошибке указывается строка и даже столбец, с ошибкой.
// синтаксическая ошибка int main() { return 0 // ошибка тут, пропущен символ точки с запятой }
Сообщение компилятора об ошибке:
Сообщения об ошибках могут различаться, в зависимости от используемой IDE. Например данные сообщения были сгенерированы MVS2010, где C2143 — код ошибки, описание которой можно найти на сайте MSDN. Стало быть, в сообщении указываются:
- код ошибки —
C2143
- тип ошибки —
синтаксическая ошибка
- суть ошибки —
отсутствие ";" перед "}"
- адрес исполняемого файла —
e:\install\c++\snake\snake\snake.cpp
- номер строки —
10
- столбец —
1
- имя файла —
snake
По большому счёту, такие ошибки и отлавливать не требуется, это делает за нас компилятор. Наша же задача — понять сообщение об ошибке и исправить её. Что касается ошибок времени выполнения, то компилятор не может их поймать. Поэтому эта задача полностью ложится на программиста. Но вам, мои читатели, по секрету скажу, что есть инструмент отладки Valgrind, который хорошо справляется с этой работой.
Как бы то ни было, и такие ошибки можно легко отлавливать. Вот, к примеру, рассмотрим нередкий случай возникновения логической ошибки.
int counter = 1; while (counter = 1) // ОШИБКА { counter--; }
В этом фрагменте кода допущена ошибка в условии цикла while
, вместо знака сравнения ==
, стоит знак присваивания =
. Такую ошибку компилятор не заметит, да и программисту трудно будет её отловить. Как только начнёт работать цикл, программа перестанет нормально функционировать, просто зависнет. а всё потому, что цикл бесконечный, то есть выхода из него нет. В данном фрагменте кода, ошибку найти легко, но вот когда программа большая и в цикле выполняется несколько десятков операторов, то понять почему не работает код не просто. Для этого мы добавляем одну строку в тело цикла while
.
int counter = 1; while (counter = 1) // ОШИБКА { counter--; cout << counter << endl; // вывод на экран значения переменной counter }
В этом случае, после запуска программы мы увидим, что значение переменной counter < 1
, а точнее, равно 0, но работа цикла не завершается. Почему? Ведь в условии counter
должен быть равен 1. Проверяем условие и находим ту самую ошибку, исправляем и удаляем строку с оператором вывода.
int counter = 1; while (counter == 1) // исправленная ошибка { counter--; }
Суть данного метода — проанализировать значения переменных по ходу работы программы и понять, в чём ошибка. Узнать более подробно о стратегиях отладки, советах и приемах, помогающих ускорить этот процесс.
Комментарии