Что? Это не было запланировано! Поиск логических ошибок
Обновлен: Ноябрь 2007
На этом занятии будет рассмотрен поиск логических ошибок в программе.
На предыдущих занятиях было рассказано о том, как найти и исправить ошибки компиляции и времени выполнения. Третий тип ошибок программирования — логические ошибки — обнаружить труднее всего. При наличии логических ошибок вы не получите предупреждений: программа будет запускаться, но будет выдавать неверные результаты. Понадобится прочитать написанный код и определить причину ошибки.
К счастью, в этом могут помочь средства отладки Visual Basic. Два метода отладки — задание точек останова и пошаговое выполнение кода — позволяют проверить код в ходе его выполнения, чтобы найти ошибку.
Точку останова можно установить в Редакторе кода на любой строке исполняемого кода. При работе программы точки останова принудительно приостанавливают выполнение при достижении заданной строки кода. Затем можно получить любые сведения о состоянии программы на данный момент. Например, можно проверить значение любой переменной, проверить выражения в окне Немедленной проверки или внести изменения в код и продолжить выполнение.
В режиме приостановки исполнения можно выполнять шаги, пропуская фрагменты кода, выполняя код по одной строке, чтобы видеть, как он работает. Нажатие клавиши F8 вызывает выполнение текущей строки кода и останов на следующей строке. Это позволяет проверить значения переменных, чтобы увидеть их изменение от одной строки кода к другой.
Если текущая строка кода вызывает функцию или процедуру Sub, расположенную в другом месте кода, при нажатии клавиши F8 будет произведен переход в эту процедуру. После прохода процедуры происходит переход на строку, следующую после той, что вызвала процедуру. Если проход через процедуру не требуется, можно нажать Shift + F8, чтобы пропустить ее.
Практическое задание
Чтобы наблюдать за логическими ошибками
В меню Файл выберите команду Создать проект.
В области Шаблоны в диалоговом окне Новый проект выберите Приложение Windows.
В поле Имя введите LogicErrors и нажмите кнопку ОК.
Откроется новый проект Windows Forms.
Из Панели элементов перетащите два элемента управления TextBox и Button на форму.
Дважды щелкните Button1, чтобы открыть редактор кода.
В обработчик событий 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))
Добавьте следующую функцию после строки End Sub.
Function GetMPH(ByVal miles As Double, ByVal hours As Double) _ As String GetMPH = CStr(miles / hours) End Function
Нажмите клавишу F5 для запуска программы. В первом текстовом поле введите 10 (10 минут), во втором текстовом поле введите 5 (5 миль) и нажмите кнопку Button1.
Отобразится окно сообщения с текстом "Средняя скорость 0.03333334"; однако если за 10 минут было пройдено 5 миль, то правильным ответом должно быть значение 30 миль в час.
Не закрывайте проект. В следующей процедуре будет рассказано о том, как найти логическую ошибку.
Поиск логических ошибок
В последнем примере логика программы явно неверна. В соответствии с результатом скорость меньше одной мили в час, а не 30 миль в час, как следовало бы ожидать — но где же ошибка?
В следующей процедуре будут установлены точки останова, и код будет выполнен по шагам, чтобы найти ошибку.
Практическое задание
Чтобы задать точку останова и проверить код по шагам
В редакторе кода найдите строку hours = minutes / 60, затем щелкните поле на левой стороне окна рядом с этой строкой.
На границе формы должна отобразиться красная точка и код должен быть подсвечен красным, что обозначает точку останова.
Нажмите клавишу F5 для повторного запуска приложения. В первом текстовом поле введите 10, а во втором — 5. Затем нажмите кнопку Button1.
Программа приостанавливается при достижении точки останова. Строка hours = minutes / 60 подсвечивается желтым.
Проверьте значения переменных, удерживая над ними мышь. Значение hours должно быть равно 0, а значение minutes — 10.
Нажмите клавишу F8 для выполнения строки hours = minutes / 60 и перейдите на следующую строку.
Проверьте значения переменных в строке MsgBox("Average speed " & GetMPH(hours, miles)). Значение hours теперь должно быть равно 0.166666672, а значение miles — 5.0.
Нажмите клавишу 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.
Ошибка произошла, так как аргументы переданы в неправильном порядке, что и привело к неверному расчету. Если бы аргументы были различного типа, произошла бы ошибка во время выполнения; но так как аргументы имеют один и тот же тип, ошибки во время выполнения не произошло. Это была простая ошибка, но найти причину полученной ошибки было трудно.
В следующей процедуре будут установлены точки останова, и код будет выполнен по шагам, чтобы найти ошибку.
Практическое задание
Чтобы исправить логическую ошибку
В редакторе кода измените строку MsgBox("Average speed " & GetMPH(hours, miles)) следующим образом:
MsgBox("Average speed " & GetMPH(miles, hours))
Удалите точку останова, нажав на красную точку на поле в левой части окна.
Нажмите клавишу F5 для запуска программы. В первом текстовом поле введите 10, а во втором — 5. Затем нажмите кнопку Button1.
На этот раз в окне сообщения отображается правильный результат: "Средняя скорость 30".
Может показаться, что программа исправлена, но есть и другая логическая ошибка, более сложная для поиска. Чтобы попробовать найти ее, не закрывайте проект. Он будет использован снова в занятии Другая ошибка. Что-то до сих пор не так.
Следующие действия
В этом разделе было рассказано о том, как найти и исправить логические ошибки. Теперь можно перейти к следующему занятию по использованию комментариев или попробовать найти другую логическую ошибку в разделе Другая ошибка. Что-то до сих пор не так.
Следующее занятие: Создание заметок в программах. Использование комментариев
См. также
Задачи
Это не работает! Поиск и устранение ошибок времени выполнения