Что? Это не было запланировано! Поиск логических ошибок

Обновлен: Ноябрь 2007

На этом занятии будет рассмотрен поиск логических ошибок в программе.

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

К счастью, в этом могут помочь средства отладки Visual Basic. Два метода отладки — задание точек останова и пошаговое выполнение кода — позволяют проверить код в ходе его выполнения, чтобы найти ошибку.

Точку останова можно установить в Редакторе кода на любой строке исполняемого кода. При работе программы точки останова принудительно приостанавливают выполнение при достижении заданной строки кода. Затем можно получить любые сведения о состоянии программы на данный момент. Например, можно проверить значение любой переменной, проверить выражения в окне Немедленной проверки или внести изменения в код и продолжить выполнение.

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

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

Практическое задание

Чтобы наблюдать за логическими ошибками

  1. В меню Файл выберите команду Создать проект.

  2. В области Шаблоны в диалоговом окне Новый проект выберите Приложение Windows.

  3. В поле Имя введите LogicErrors и нажмите кнопку ОК.

    Откроется новый проект Windows Forms.

  4. Из Панели элементов перетащите два элемента управления TextBox и Button на форму.

  5. Дважды щелкните Button1, чтобы открыть редактор кода.

  6. В обработчик событий Button1_Click добавьте следующий код.

    Dim minutes As Integer = CInt(Textbox1.Text)
    Dim miles As Double = CDbl(Textbox2.Text)
    Dim hours As Double = 0
    hours = minutes / 60
    MsgBox("Average speed " & GetMPH(hours, miles))
    
  7. Добавьте следующую функцию после строки End Sub.

    Function GetMPH(ByVal miles As Double, ByVal hours As Double) _
    As String
        GetMPH = CStr(miles / hours)
    End Function
    
  8. Нажмите клавишу F5 для запуска программы. В первом текстовом поле введите 10 (10 минут), во втором текстовом поле введите 5 (5 миль) и нажмите кнопку Button1.

    Отобразится окно сообщения с текстом "Средняя скорость 0.03333334"; однако если за 10 минут было пройдено 5 миль, то правильным ответом должно быть значение 30 миль в час.

    Не закрывайте проект. В следующей процедуре будет рассказано о том, как найти логическую ошибку.

Поиск логических ошибок

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

В следующей процедуре будут установлены точки останова, и код будет выполнен по шагам, чтобы найти ошибку.

Практическое задание

Чтобы задать точку останова и проверить код по шагам

  1. В редакторе кода найдите строку hours = minutes / 60, затем щелкните поле на левой стороне окна рядом с этой строкой.

    На границе формы должна отобразиться красная точка и код должен быть подсвечен красным, что обозначает точку останова.

  2. Нажмите клавишу F5 для повторного запуска приложения. В первом текстовом поле введите 10, а во втором — 5. Затем нажмите кнопку Button1.

    Программа приостанавливается при достижении точки останова. Строка hours = minutes / 60 подсвечивается желтым.

    Проверьте значения переменных, удерживая над ними мышь. Значение hours должно быть равно 0, а значение minutes — 10.

  3. Нажмите клавишу F8 для выполнения строки hours = minutes / 60 и перейдите на следующую строку.

    Проверьте значения переменных в строке MsgBox("Average speed " & GetMPH(hours, miles)). Значение hours теперь должно быть равно 0.166666672, а значение miles — 5.0.

  4. Нажмите клавишу F8 снова, чтобы выполнить текущую строку.

    Обратите внимание, что происходит переход к строке Function GetMPH.

    Проверьте значения переменных в этой строке. Значение miles теперь равно 0.166666672, а значение hours — 5.0, что противоречит предыдущей строке. Ошибка найдена.

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

Устранение логических ошибок

В предыдущей процедуре значения переменных miles и hours поменялись местами. Вы можете понять причину?

Если взглянуть на строку MsgBox("Average speed " & GetMPH(hours, miles)), то будет видно, что функция GetMPH принимает аргументы hours и miles в указанном порядке. Если взглянуть на объявление функции Function GetMPH(ByVal miles As Double, ByVal hours As Double)..., можно заметить, что сначала следует аргумент miles, а затем hours.

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

В следующей процедуре будут установлены точки останова, и код будет выполнен по шагам, чтобы найти ошибку.

Практическое задание

Чтобы исправить логическую ошибку

  1. В редакторе кода измените строку MsgBox("Average speed " & GetMPH(hours, miles)) следующим образом:

    MsgBox("Average speed " & GetMPH(miles, hours))
    
  2. Удалите точку останова, нажав на красную точку на поле в левой части окна.

  3. Нажмите клавишу F5 для запуска программы. В первом текстовом поле введите 10, а во втором — 5. Затем нажмите кнопку Button1.

    На этот раз в окне сообщения отображается правильный результат: "Средняя скорость 30".

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

Следующие действия

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

Следующее занятие: Создание заметок в программах. Использование комментариев

См. также

Задачи

Это не работает! Поиск и устранение ошибок времени выполнения

Знайте свои ошибки. Три типа ошибок в программировании

Поиск ошибок. Введение в отладку в Visual Basic