Панель Watch

View > Watch - показать или скрыть эту панель. См. также: Отладка

Значок шестерёнки в TIDE. У этой панели есть связанная страница настроек TIDE Preferences (File > TIDE Preferences -> IDE -> Watch and Locals).

Аннотированный снимок экрана панели Watch в TIDE.

Список наблюдения может содержать переменные и выражения. Возможность вычислять выражения исключительно полезна. Например, можно ввести c_arr[f], и вы увидите значение элемента f массива c_arr.

Добавить запись в список можно несколькими способами:

  • Кнопка Add to Watch List в TIDE.Выберите Debug > Add to Watch List
  • В исходном коде щёлкните переменную правой кнопкой и выберите Add to Watch List
  • Дважды щёлкните в любом пустом месте панели Watch
  • Нажмите [INSERT], когда фокус находится в панели Watch

Записи списка можно перетаскивать, меняя их порядок.

Чтобы изменить запись, дважды щёлкните имя переменной (или выражение) в поле Name or Expression.

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

Значения переменных можно менять прямо в панели Watch - для этого дважды щёлкните текущее значение и отредактируйте его.

Значения выражений в панели Watch изменить нельзя.

Значения свойств объектов также можно просматривать и редактировать в панели Watch.

Области видимости в Watch

Если VM находится в состоянии BREAK (то есть вы находитесь внутри исполняемого кода), Watch рассматривает список переменных в панели Watch с точки зрения контекста (области видимости), в котором находится (жёлтый) указатель выполнения.

Пример: вы находитесь внутри обработчика события on_sys_timer, в котором есть переменная x. Есть также глобальная переменная с таким же именем. Поскольку указатель выполнения внутри обработчика, панель Watch истолкует запись x как относящуюся к локальной области on_sys_timer.

Аннотированный снимок экрана панели Watch в TIDE.

Легко запутаться в областях видимости при работе с подсказками Watch.

Допустим, в вашем коде две процедуры, и в обеих есть локальная переменная f. (Жёлтый) указатель выполнения находится в foo(), а вы наводите курсор на переменную с таким же именем в moo().

Что вы увидите? Всё равно значение f из foo(), хотя курсор находится в другой процедуре. Дело в том, что именно эта область сейчас локальная - f из moo() в данный момент фактически не существует!

TIDE даже предупредит вас, добавив сообщение: This value might belong to a variable from a different scope (это значение может принадлежать переменной из другой области видимости).

Снимок экрана панели Watch в TIDE.

Если VM находится в состоянии PAUSE (то есть никакой код не выполняется), у Watch есть только глобальная область видимости.

Переключение области видимости через панель Call Stack

Двойной щелчок по любой записи в панели Call Stack переносит вас в соответствующее место исходного кода (оно выделяется синим) и одновременно меняет область видимости, которую использует Watch. То есть область видимости Watch переключается на область того места, по которому вы дважды щёлкнули в панели Call Stack.

Правила интерпретации выражений Tibbo BASIC и C

Панель Watch по необходимости двуязычна. Она понимает и Tibbo BASIC, и C.

Простые типы переменных совместимы между Tibbo BASIC и C. Переменная unsigned char в C в BASIC называется byte. Оба названия обозначают один и тот же тип данных.

Если выполнение остановлено в состоянии BREAK внутри кода Tibbo BASIC, Watch рассматривает простые переменные (и выражения, включающие только простые переменные) с точки зрения Tibbo BASIC. Для простой переменной в поле Interpreted as будет указано BASIC, а в поле Type тип переменной будет записан в нотации Tibbo BASIC (то есть byte, char, word и так далее).

Если BREAK происходит внутри кода Tibbo C, Watch рассматривает простые переменные (и выражения, включающие только простые переменные) с точки зрения Tibbo C. Для той же простой переменной в поле Interpreted as будет указано C, а в поле Type будет использована нотация C (то есть unsigned char, char, unsigned int и т. д.).

Сказанное верно даже для глобальных простых переменных. Даже если такая переменная определена в Tibbo C, она будет «интерпретироваться как» переменная Tibbo BASIC, если выполнение останавливается (BREAK) внутри кода Tibbo BASIC (и наоборот).

Если выполнение находится в состоянии PAUSE , то есть никакой код не выполняется вовсе, Watch не может применить это правило для выбора режима интерпретации простых переменных. Вместо этого Watch ориентируется на текущее положение курсора |.

Если открытый в данный момент исходный файл - файл Tibbo BASIC, Watch использует интерпретацию Tibbo BASIC. Если открытый исходный файл - файл Tibbo C, Watch использует интерпретацию Tibbo C.

С массивами, структурами и объединениями ситуация иная.

Массивы и типы Tibbo BASIC (структуры BASIC) несовместимы с массивами и структурами Tibbo C. Интерпретации C для них не существует.

Для таких переменных и выражений с ними Watch всегда использует единственную доступную интерпретацию. Для массивов и типов Tibbo BASIC (и выражений с ними) Watch всегда использует интерпретацию BASIC. Для массивов, типов и объединений Tibbo C (и выражений с ними) Watch всегда использует интерпретацию BASIC.

Вот интересный пример.

Переменная-массив c_arr определена в Tibbo C, а выполнение сейчас приостановлено в коде Tibbo BASIC.

Вы хотите добавить в Watch запись, показывающую значение элемента f массива c_arr.

Что нужно ввести - c_arr(f), как требует Tibbo BASIC, или c_arr[f] , как принято в Tibbo C? Верен вариант Tibbo C!

Поскольку c_arr определён в Tibbo C (BASIC не понимает массивы C), Watch истолкует это выражение как выражение C. Поэтому для обращения к элементу массива нужно использовать синтаксис C.

Запись будет и дальше показываться в интерпретации C, где бы ни произошёл BREAK.

Исходный материал Tibbo обновлён 12 сентября 2022Оригинал на docs.tibbo.com · Сообщить об ошибке