Render.ru

Запись двумерного массива

aly8

Активный участник
Рейтинг
10
#1
Есть код:

Код:
(
	global a = #()
	local b = #()
	for i = 1 to 3 do
	(
		b[i] = i^2
		append a b
		)
	a
	)
на выходе:
Код:
#(#(1, 4, 9), #(1, 4, 9), #(1, 4, 9))
а надо :
Код:
#(#(1), #(1, 4), #(1, 4, 9))
Посоветуйте пожалуйста, как этого можно добиться?

Что самое интересное в листере все работает как хотелось бы:

Код:
a = #(1) -- enter
#(1)   
b = #(a,a) -- enter
#(#(1), #(1))
a = #(2) -- enter
#(2)
b -- enter
#(#(1), #(1))
т.е. массив b не присваивает значения измененного массива a, только если заново не задать b = #(a,a) (по сути сохраняет старое значение)
 

RENDERATOR

Активный участник
Рейтинг
15
#2
В первом примере Вы в цикле добавляете к массиву a ссылку на ту же область памяти, на которую ссылается переменная b.
В итоге при выходе из цикла массив a просто содержит три ссылки на одну и ту же область памяти.
Вам нужно в цикле добавлять новую копию массива b. Например, с помощью метода deepCopy.

Код:
(
	global a = #()
	local b = #()
	for i = 1 to 3 do
	(
		b[i] = i^2
		append a (deepCopy b)
	)
	a
)
 
Сверху