Национальный исследовательский университет "Высшая Школа Экономики"
Опубликован: 01.04.2010 | Доступ: свободный | Студентов: 4353 / 899 | Оценка: 4.45 / 4.06 | Длительность: 08:48:00
ISBN: 978-5-9556-0119-9
Специальности: Программист
Лекция 3:

Средства получения справки и отладки программ

< Лекция 2 || Лекция 3: 123 || Лекция 4 >

Отладка программ

Ошибки делятся на три категории: ошибки разработки (синтаксические ошибки), ошибки компиляции, ошибки выполнения.

Синтаксическая ошибка - это нарушение правил языка VBA.

Это может быть некорректный оператор, неверно введенное имя переменной, если объявление переменных обязательно ( Tools-Options-вкл.Editor -включена опция Require Variable Declaration ), отсутствие разделителей между аргументами, несоответствие открывающих и закрывающих скобок, отсутствие закрывающих операторных скобок ( End If, Next и др.), не уникальное название процедуры и т.п.

Рекомендуется:
  • включать опцию автоматической проверки синтаксиса - Auto Syntax Check ;
  • пользоваться контекстно-зависимой подсказкой, которая возникает при наборе имен объектов, их свойств или методов и которая устанавливается опцией Auto Quick info ;
  • выполнять правила синтаксиса при записи функций и конструкций языка. Для уточнения этих правил в окне программы можно выделить ключевое слово, оператор, функцию, объект, его свойство или метод и нажать клавишу F1. Появится окно справочной системы, которое соответствует выделенному фрагменту кода и показывает допустимую форму записи оператора.

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

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

На этапе выполнения программы выявляются ошибки, которые не могли быть обнаружены редактором Visual Basic ( ошибки выполнения ).

Логические ошибки в программе не противоречит синтаксису оператора, но могут привести к неверным результатам выполнения программы. Примерами логических ошибок могут служить неверные имена или типы переменных, бесконечные циклы, ошибочные условия или неверные размеры массивов.

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

Во время выявления какой-нибудь ошибки происходит прерывание программы, если на вкладке General (Общие) диалогового окна Options установлена опция Break on All Errors (Останов при любой ошибке).

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

Окна отладчика

Процесс проверки работоспособности программы носит название "отладка" или "тестирование".

Для отладки процедур используются различные приемы:

  • прерывание программы в заданной точке (контрольная точка - Breakpoint ) или при выполнении некоторого условия;
  • выполнение программы по шагам (по операторам) - Step ;
  • отслеживание значений переменных или свойств объектов (контрольные значения) - Watch ;
  • изменение значений переменных вручную;
  • редактирование текста программы в режиме прерывания;
  • продолжение выполнения программы, начиная с некоторого оператора и т.п.

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

В режиме отладки программы можно продолжить или прервать выполнение программы, используя кнопкииили соответствующие команды меню Run. Можно выполнять программу по шагам.

При корректировке текста программы в режиме прерывания редактор VB иногда выдает сообщение о невозможности продолжения программы.

Если Вы не уверены в том, как будет выполняться исправляемая команда, то

Рекомендуется:
  • перейти в окно Immediate Window ;
  • скопировать в него или заново набрать в нем нужную команду;
  • выполнить ее.

В режиме прерывания в этом окне будут доступны те же переменные, которые были доступны выполняемой процедуре в момент прерывания программы. Так как операторы, введенные в окне Immediate Window, не сохраняются после завершения работы с MS Excel. Если они должны быть сохранены, то их необходимо скопировать в программу.

Immediate Window (окно проверки)

Это окно (часто используется термин "оперативная панель") имеет две основные функции:

  • выполнение команд;
  • распечатка значений переменных или выражений во время выполнения процедур (одна из возможностей отладки программ).

Окно проверки используется для следующих целей:

  • отображения информации, получаемой в результате выполнения команд процедуры (отладочная печать);
  • тестирования команд, вводимых непосредственно в этом окне;
  • получения или изменения значений переменных;
  • получения или изменения значений свойств объектов, доступных в выполняемой процедуре.

Чтобы вывести на экран окно отладки, выберите команду Immediate Window в меню View или нажмите клавиши Ctrl+G.

Замечание:
  • Операторы, вводимые в окне проверки, выполняются в контексте, т.е. так, как если бы они вводились в выполняемую процедуру.

Окно открывается командой Immediate Window меню View (клавиши Ctrl+G ) и закрывается только щелчком на кнопку закрытия окна.

Важно:
  • Окно Immediate полезно при вводе однострочных команд.
  • Для вычислений в этом окне используйте знак вопроса (?) или оператор Print перед рассчитываемым выражением,
  • Любой оператор, записанный в строке окна или скопированный в это окно из текста процедуры, будет выполнен после нажатия клавиши Enter. Рассчитанное значение появляется в строке, следующей за выполненным оператором. Если скопированный оператор является оператором присваивания, то переменной будет присвоено рассчитанное значение.
    Прерывание программы

    Рис. 3.7. Прерывание программы
    На рис. 3.7 в первой строке панели Immediate записана команда расчета произведения чисел 6 и 5, результат которого 30 виден во второй строке.

    В третьей строке записан оператор расчета площади круга, вычисляемый в режиме пошагового выполнения процедуры Circle_sq, а в четвертой строке - результат расчета этого оператора.

    В пятой строке расположен оператор присваивания, скопированный из этой же процедуры в режиме пошагового выполнения процедуры Circle_sq. После нажатия клавиши Enter на панели Immediate не появляется результат расчета, но при установке курсора на название вычисляемой переменной (s) высвечивается вычисленное значение.

  • Если в коде программы встречается Debug.Print, после которой стоит переменная для вывода, то значение переменной будет выведено в окне Immediate ( рис. 3.8).
    Вывод в окне Immediate значений переменных s1 и n

    Рис. 3.8. Вывод в окне Immediate значений переменных s1 и n
  • Команды (операторы), введенные в этом окне, можно неоднократно повторять. Используйте линейку прокрутки для просмотра содержимого окна. Достаточно установить точку вставки на нужную строку и нажать Enter. Выбранный оператор повторно выполнится. Набранную ранее команду можно предварительно откорректировать. Повторять ранее введенные команды можно в любом порядке.

Примеры

Оператор ? 355/113 рассчитает приблизительное значение числа pi.

Оператор Debug.Print "value of a ",a, расположенный в теле процедуры, распечатает указанный текст и значение переменной a на одной строке.

Окно значения переменной

Если в программе установлена контрольная точка, то можно просмотреть значения переменных. Достаточно подвести курсор ( рис. 3.9) к идентификатору переменной внутри выполняемой процедуры и рядом с текстовым курсором появится текущее значение этой переменной как контекстная подсказка.

Окно значения переменной показывает значение переменной Var_A, равное 2

Рис. 3.9. Окно значения переменной показывает значение переменной Var_A, равное 2

Locals Window (окно локальных переменных)

Окно локальных переменных отображает все описанные в текущей процедуре переменные и их значения. Окно высвечивается командой Locals Window из меню View.

Окно локальных переменных

Рис. 3.10. Окно локальных переменных

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

В столбце Expression (Выражение) перечисляются все переменные, доступные в выполняемой процедуре. Первая переменная в этом списке - особая переменная, которая может быть развернута для просмотра всех переменных уровня текущего модуля, т.е. переменных, которые определены в области описаний модуля ( Declarations ). Для стандартных модулей ее имя совпадает с именем модуля. Для модулей класса или для процедурных листов формы это системная переменная Me.

Составные переменные (массивы, пользовательские типы) могут быть свернуты или развернуты для просмотра значений составляющих их элементов - слева от названий таких переменных находятся соответствующие пиктограммы + или -.

На рис. 3.10 переменная Модуль1 развернута и в окне показаны переменные, объявленные в области описаний модуля.

В столбце Value (Значение) можно изменять значения переменных. Курсор, установленный на значении переменной, принимает форму текстового курсора. Введите новое значение и для сохранения модифицированного значения нажмите любую из клавиш Enter, Up, Down, Tab, Shift+Tab или щелкните левой кнопкой внутри окна Locals.

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

Например, при вводе нуля в переменную типа Date значение заменится на 0:00:00. При вводе даты в переменную Integer может произойти ошибка Overflow, а введенное в переменную Integer символьное значение заменится на нуль.

В столбце Type (Тип) окна Locals отражаются типы переменных. Данные в этом столбце не редактируются.

В первой строке окна Locals отображается название текущей процедуры, проект и модуль, в котором она расположена. Вызванная процедура помещается на вершину стека выполняемых процедур и удаляется из стека после ее окончания. Можно просмотреть текст любой процедуры из стека и соответствующее ей окно локальных переменных. Для этого нажмите кнопку Call Stack(см. рис. 3.10). Высвечивается окно стека вызовов ( Call Stack ), в котором надо выбрать нужную процедуру и нажать кнопку Show (Показать).

Окно стека вызовов процедур

Рис. 3.11. Окно стека вызовов процедур

На рис. 3.11 показано окно стека с двмя процедурами, запущенными в следующей последовательности: Value_A, first. Окно локальных переменных на рис. 3.10 отражает значения переменных, доступных выбранной в этом окне процедуре Value_A.

< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Дмитрий Денисов
Дмитрий Денисов

Еще раз повторяю вопрос  - отправил договор и сканы документов по почте - в начале августа, до  5 го, внес предоплату - летом действовала скидка - чтобы пройти курс в августе, но я уезжал в Москву. По возвращению - и  в течение месяца - никакого ответа, никаких зачислений, ничего. Как проверить, пришли ли мои документы в Интуит, предоплата, почему нет зачисления.

Дмитрий Денисов
Дмитрий Денисов

Как записаться на курс, оплатить, не ориентируюсь в программе.

Ранее у Вас учился.

Работаю преподавателем, есть справка. Как получить скидку, т.е. оплата 2000