Передача аргументов по ссылке

Передача аргументов по значению

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

1. Введите в новом окне редактора MAXScript Editor следующий фрагмент кода и вычислите результат:

m = 30.4

n = 23.0

function addnums2 х у =

(

x = 10.0

x+y

)

addnums2 m n

2. В ответ в окне приемника команд появляется значение 33,0.

3. Введите m в окне приемника команд и вычислите значение данной переменной.

4. В результате значение переменной m оказывается равным 30,4.

Обратите внимание на то, что сумма чисел равна 33,0. Когда функция получает аргументы, переменным x и y присваиваются копии передаваемых значений. В данном случае переменная x получает копию значения 30,4 аргумента m, а переменная y — копию значения 23,0 аргумента n. После выполнения функции значение аргумента m остается без изменения, поскольку переменная x содержит лишь копию значения аргумента m.

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

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


Основы MAXScript

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

Для передачи аргументов по ссылке необходимо сделать следующее.

• Передать функции адрес аргумента, а не его значение. Для этого перед переменной указывается символ амперсанда (&), например:

addnums2 &m n

• Указать символ & перед соответствующим параметром в обозначении функции, например:

function addnums2 &x y =

В MAXScript (как и в других языках программирования) символ & называется оператором ссылки. Такой оператор обозначает адрес переменной. Более подроб­ное рассмотрение адресов и связанных с интерфейсоми вопросов программирования выходит за рамки данной книги.

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

1. Откройте новое окно редактора MAXScript Editor по команде MAXScript ⇨ NewScript из меню в этом окне.

2. Введите в окне редактора сценариев следующий фрагмент кода и выполните его, нажав комбинацию клавиш <Ctrl+E>:

m = 30.4

n = 23.0

function addnums2 &x y =

(

x = 10.0

x+y

)

addnums2 &m n

В окне приемника возвращается значение 33,0.

3. Введите m в окне приемника команд и вычислите значение данной переменной.

В результате значение переменной m оказывается равным 10,0.

Как видите, данная функция по-прежнему возвращает значение 33, 0, однако значение переменной m теперь равно 10,0, а не 30,4, поскольку оно изменилось внутри функции.

Примечание. При создании функции любые параметры можно определить "по ссылке". Так, в функции addnums2 можно было бы указать "по ссылке" оба параметра, а не один лишь параметр (&x).


Глава 1

Исключение из правила передачи аргументов по значению (дополнительный материал)

Из правила передачи аргументов функциям MAXScript по значению имеется следующее исключение: если переменная, имеющая подсвойства, передается функции, указатель или переменная объекта передается по значению. Однако подсвойства объекта передаются по ссылке. Эта ситуация демонстрируется в следующем упражнении.

1. Установите 3dsMax в исходное состояние.

2. Откройте новое окно редактора MAXScript Editor по команде MAXScript ⇨ NewScript из меню в этом окне.

3. Введите в окне редактора сценариев следующий фрагмент кода и выполните его, нажав комбинацию клавиш <Ctrl+E>:

myPoint = Point3 10 20 30

function modifyPoints pnt =

(

pnt.x = 3

pnt = point3 7 14 21

)

modifyPoints myPoint

В окне приемника команд возвращается литерал [7, 14, 21] типа point3, который представляет собой новое значение типа Point3, созданное внутри функции.

4. Введите myPoint в окне приемника команд и вычислите значение данной переменной.

Результат равен [3,20,30].

Как видите, значение переменной myPoint не изменилось в результате присвоения нового значения переменной pnt внутри функции. В то же время значение свойства .x переменной myPoint изменилось в результате присвоения нового значения свойству pnt. x внутри функции.

Фрагменты кода из приведенных выше упражнений можно обнаружить в файле сценария \chapter1\pass_by_value_reference.ms на прилагаемом к этой книге CD-ROM.