Установка активного кадра стека

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

В отладчике имеется весьма эффективная команда 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