Установка активного кадра стека
Во время выполнения сценария возможны многочисленные вызовы функций или переходы к выполнению разных блоков кода. Как пояснялось выше, такие вызовы отслеживаются в стеке. Когда выполнение сценария останавливается, в окне вывода из отладчика появляется соответствующая информация из стека. Нулевой уровень стека соответствует верхнему кадру стека, а на каждом последующем уровне стека находится предыдущий вызов, и так до самого начала сценария.
В отладчике имеется весьма эффективная команда setFrame, позволяющая возвращаться обратно по сценарию в режиме его прерывания. Её синтаксис следующий: setFrame <целое число>
В этой команде указанный кадр стека задается в качестве активного. Если ввести команду setFrame в командной строке отладчика, точка выполнения сценария сместится к предыдущему коду. Нетрудно заметить, что после того как будет задан активный кадр стека, переменные из кадра стека с меньшим номером окажутся вне заданной области действия, тогда как переменные из нового кадра стека окажутся в этой области действия.
Так, если выполнение сценария остановлено в точке, находящейся на глубине трех вызовов функций, и при этом требуется запросить значение локальной переменной, которая установлена в первой функции, достаточно вернуться к данной функции, просмотреть ее значение и возобновить выполнение сценария в отладчике.
В следующем упражнении приведен пример задания активного кадра стека.
1. Установите 3dsMax в исходное состояние и откройте новое окно редактора MAXScript Editor.
2. Введите и сохраните следующий сценарий:
function terrier c = (
d = 2 * с
break()
Приложение
return d
)
function dog b =
(
tr = 2 * terrier b
)
function quadroPed a =
(
dg = 2 * dog a
)
function mammal =
(
h = [1,2,3]
qp = quadroPed h
)
mammal()
Вычислите сценарий.
Откроется окно отладчика, а в окне вывода из отладчика появится отладочная информация.
Откройте окно Watch Manager и введите все переменные и параметры, используемые в сценарии:
В данный момент определены только переменные сиd. Введите в командной строке отладчика следующую команду: setFrame 1
Содержимое окна Watch Manager обновляется и в нем отображаются переменные b и tr, а переменные сиd обозначаются как необъявленные (Undeclared), поскольку они оказываются вне данной области действия.
Приложение
Если требуется, вы можете изменить значение переменной b в окне Watch Manager, но с определенными ограничениями. В частности, переменной b можно присвоить значение типа integerили float.
А вот значения типа Point3 нельзя изменить в окне Watch Manager. Если изменить значение переменной b в окне Watch Manager, а затем возобновить выполнение сценария, новое значение этой переменной не будет передано функции terrier. Вместо него будет использовано старое значение, т.е. [1,2,3].
Для того чтобы изменить значение типа Point3 переменной b, необходимо ввести команду eval в командной строке отладчика: eval <выражение MAXScript>
6. Введите в командной строке отладчика следующую команду и нажмите клавишу <Enter>:
eval b = [1,1,3]
Обратите внимание на обновление содержимого окна Watch Manager и окна вывода из отладчика. В них появилось новое значение [1,1,3] переменной b. Если возобновить выполнение сценария, выбрав кнопку Run, старое значение переменной b будет по-прежнему передаваться функции terrier, поскольку в этой функции все еще используется старое значение переменной c. Тем не менее с помощью команды eval можно вычислять отдельные части сценария.
7. Введите в командной строке отладчика следующую команду и нажмите клавишу <Enter>:
eval tr = 2 * terrier b
Вновь обратите внимание на обновление содержимого окна Watch Manager и окна вывода из отладчика. В них появилось новое значение [4,4,12] переменной tr.
Тем не менее это значение переменной tr остается временным. Если щелкнуть на кнопке Run, чтобы завершить сценарий, функция mammal будет по-прежнему возвращать устанавливаемое по умолчанию значение [8,16,24].
Дополнительные сведения об отладчике приведены в следующих разделах справочного руководства по MAXScript.
• MAXScript Debugger ⇨ The MAXScript Debugger
• MAXScript Debuggen ⇨ Using the MAXScript Debugger