§ 6. Использование основных алгоритмических конструкций для решения задач

6.1. Отладка программ в среде Code::Blocks

В помощь пользователю почти любой среды программирования предоставляются средства, необходимые для отладки программы. Они позволяют тщательно протестировать программу и устранить все ошибки в ней (пример 6.1). Среда Code::Blocks содержит отладчик, который позволяет выполнить программу построчно, просматривать и модифицировать переменные и выражения. Отладчик встроен в интегрированную среду, и поэтому пользователь может редактировать, компилировать и отлаживать программу, не выходя из среды.

Ошибки компиляции

Ошибки компиляции, или синтаксические ошибки, возникают в том случае, если не описана некоторая переменная, передается неправильное количество параметров функции, пропущена точка с запятой или скобка и т. д. С исправлением ошибок, обнаруженных во время компиляции, сложностей практически не возникает. Компилятор, обнаружив в программе ошибки, завершает работу и выдает информацию об ошибках в окне редактора кода, на вкладке Build log (пример 6.2). Исправив ошибки, обнаруженные таким образом, можно повторить компиляцию программы.

Ошибки выполнения

Ошибки выполнения, или семантические ошибки, возникают на этапе выполнения при попытке открыть несуществующий файл, делить на нуль и т. д. (пример 6.3). При этом выполнение программы прерывается. Возникновение фатальных ошибок приводит к немедленному прекращению выполнения программы.

Логические ошибки

Программа может содержать и логические ошибки. Логические ошибки позволяют компилятору выполнить программу, однако результат выполнения будет отличаться от ожидаемого. Наличие таких ошибок определяется с помощью тестирования. Обнаружить ошибку этой группы, не имея никаких отладочных средств, бывает достаточно сложно. Наличие в программе таких ошибок является одной из основных причин возникновения необходимости использования отладчика, входящего в состав интегрированной среды. Отладчик позволяет выполнить программу в диалоговом режиме, наблюдая за изменением значений отдельных переменных или выражений. Имеется возможность остановиться в заданной точке программы и изменить значения некоторых переменных и выражений.

Команды отладчика собраны в меню Debug (пример 6.4). Эти же команды продублированы на панели быстрого доступа (пример 6.5). Описание команд отладки, собранных в меню Debug, приведены в Приложении к главе 1.

Трассировка — построчное выполнение исходной программы, при котором после выполнения каждой строки можно остановиться и посмотреть результаты.

Наличие возможности выполнения исходной программы до строки, на которую указывает курсор, позволяет пропустить трассировку малоинтересных частей программы и сразу перейти в точку начала отладки. Для этих целей можно нажать F4 в строке с курсором. Если эта строка находится после ввода данных, то ввод данных произойдет как обычно, выполнение программы прервется, когда придет очередь выполнения этой строки. Необходимо переключиться из консольного окна в окно кода. Та строка, которая должна выполниться, помечается желтым треугольником  (пример 6.6).

Некоторые строки программы могут быть помечены как точки прерывания. Для этого достаточно кликнуть мышью слева от строки программы. В этом месте появится красный круг  (пример 6.7).

Когда в процессе выполнения отладки программы (запуск с помощью клавиши F8 или ) достигается точка прерывания, выполнение программы приостанавливается и на экране отображается фрагмент исходного текста программы, содержащий точку прерывания. Поверх точки прерывания устанавливается маркер отладки программы . Остановившись в точке прерывания можно просмотреть значения переменных, начать трассировку или выполнить программу до следующей точки прерывания.

Отладчик интегрированной среды Code::Blocks предоставляет возможность наблюдения за изменением переменных или выражений. Наблюдаемые объекты отображаются в окне наблюдения Watches, отражая изменения в программе при пошаговом выполнении. Для открытия окна Watches можно выполнить команду Debug  Debugging Windows  Watches или выбрать его из списка отладочных окон на панели быстрого доступа (пример 6.8).

Для добавления переменной в окно просмотра нужно добавить ее имя в первый столбец окна Watches. 

Пример 6.1. Типы ошибок:

  • ошибки компиляции (синтаксические);
  • ошибки выполнения;
  • логические ошибки.

Пример 6.2. Пример ошибки компиляции.

Все ошибки выделяются красным цветом. Для каждой ошибки указывается номер строки, в которой обнаружена ошибка, и описание этой ошибки. Серым фоном подсвечивается та из ошибок, которая выделена в программе знаком  .

Двойной щелчок по ошибке в окне Build log покажет ее местоположение в программе. Переходить к просмотру следующей ошибки можно с использованием сочетания клавиш
Alt + F2, а возвратиться к предыдущей — Alt + F1.

Пример 6.3. Пример ошибки выполнения.

Текст программы:

#include <iostream>

 

using namespace std;

 

int main()

{

    int x;

    cout << "x = ";

    cin >> x;

    int y = x / (- 5);

    cout << y;

    return 0;

}

Тестирование:

При x = 5 возникает ошибка деления на нуль, и среда выдает сообщение с кодом ошибки: «Process returned −1073741676». Если программа выполнилась успешно, то код ошибки 0: «Process returned 0».

При анализе программы компилятор выдает не только ошибки, но и предупреждения (warning) о том, что некоторые записи могут привести к ошибке. Предупреждения выделяются синим цветом.

Если в программе выше записать

    int = x / (- x);   

то при компиляции программы можно увидеть предупреждение:

Пример 6.4. Меню Debug:

Пример 6.5. Панель быстрого доступа с командами отладки:

  Пример 6.6. Режим отладки:

Пример 6.7. Точки прерывания:

Если точка прерывания установлена внутри цикла, то можно определить, сколько итераций цикла будет пропущено, перед тем как программа прервется. Сделать это можно из контекстного меню точки прерывания. Также можно указать логическое выражение, при котором сработает точка прерывания.

Пример 6.8. Окно наблюдения за значениями переменных Watches:

Окно Watches появляется «висячим», при желании его можно прицепить к окну редактора кода. Для этого нужно переместить окно Watches к окну редактора кода и выбрать место его размещения. В процессе перемещения окна место, куда его можно «прицепить», будет отображаться прямоугольником серого цвета.

В окне Watches отображаются текущие значения переменных. Переменная, которая изменилась последней, отображается красным цветом.