Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.10.2006, 22:59
SiDDD вне форума Посмотреть профиль Отправить личное сообщение для SiDDD Найти все сообщения от SiDDD
  № 1  
Ответить с цитированием
SiDDD

Регистрация: Oct 2006
Сообщений: 26
По умолчанию Как получить копию массива?

Всем драсти!

У меня такая проблема - отчегото не получается скопировать Array a1 в a3. Вместо копирования выходит что a3 содержит указатели на а1 и все изменения в а3 меняют и родича а1 (но необходимо чтоб а1 оставался нетронут)... Должно сразу сказать, что с одномерным массивом всё исправно работает! Как "выход" испробовал копирование каждого "этажа" массива с помощью FOR, но ведь это не выход.. Хотелось бы знать - возможно ли это организовать без трех страниц кода??? Всего то и хотелось бы получить копию одного МНОГОМЕРНОГО массива.

Код, что не катит (code.rar):
Код:
var i:Number=0;
var a1:Array = [[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9]];
var a3:Array = new Array();

_root.onEnterFrame=function(){
	
	a3=a1.concat();
	myTest();
	txt1.text=a1;
	txt2.text=a3;
};

function myTest(){
	
	a3[0][i]=333;
	i++;
	if(i==9) i=0;
};
Далее код который работает, но...но если у меня массив из 100 "этажей"? При 50 FPS! Ужас...
Код:
var i:Number=0;
var a1:Array = [[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9]];
var a2:Array = new Array();
var a2:Array = new Array();
var a3:Array = new Array();

_root.onEnterFrame=function(){
	
	a3=a2.concat(a1);
	a3[0]=a2.concat(a1[0]); // адын этаж
	a3[1]=a2.concat(a1[1]); // два... и так до 100!! Можно FOR использовать - но нельзя ли прощще???
	myTest();
	txt1.text=a1;
	txt2.text=a3;
};

function myTest(){
	
	a3[0][i]=333;
	i++;
	if(i==9) i=0;
};
Эххх...а как элегантно выглядело бы a3=a1........

Старый 15.10.2006, 23:32
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Код:
var a1:Array = [[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9,10]];
getArrayCopy = function(arr:Array):Array {
	var outArray:Array = new Array();
	for (var i:Number=0;i<arr.length;i++) {
		var item = arr[i];
		if (Array(item)!=null&&item!=arr) {
			outArray.push(getArrayCopy(item));
		} else {
			outArray.push(item);
		}
	}
	return outArray;
}
a2 = getArrayCopy(a1);
a2[0][1] = 134;
trace([a1[0][1],a2[0][1]]); // 2,134
Сколки-угодно-мерный…


Последний раз редактировалось etc; 15.10.2006 в 23:34.
Старый 16.10.2006, 21:40
SiDDD вне форума Посмотреть профиль Отправить личное сообщение для SiDDD Найти все сообщения от SiDDD
  № 3  
Ответить с цитированием
SiDDD

Регистрация: Oct 2006
Сообщений: 26
Пасиб большое за ответ!

Но неужели нельзя прощще?? Этот код для примера был. На деле массив 100 на 100! Ролик 50 кадров в сек. В каждом кадре необходимо вносить изменения в копию массива не затрагивая оригинал.. Этож как всё будет тормозить то?! В C++, Basic, не грю уж про ASM - простенько и элегантно решается так... Хм.. Видно только не в Action Script?

Что по вашему коду - не прощще ли тогда так:
Код:
for(i=0;i<ВСЕГО_ЭТАЖЕЙ_МАССИВА;i++) a3[i]=a1[i].concat();
Эххх, абыдна да! Почему с одномерным массивом всё отлично работает а с многомерным уже указатели передаются..

Вот и хотелось бы услышать от знатоков - нельзя ли без циклов и прочих "излишеств" скопировать один "многоэтажный" массив в другой???

Старый 16.10.2006, 21:45
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Не знаю как в Си, а в бейсике массиве были точно многомерные, а вот в АС многомерных массивом не существует. То что мы зовем многомерными массивами, являются лишь их эмуляцией, отсюда и проблемы.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 16.10.2006, 21:48
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Нет, нельзя.

Старый 16.10.2006, 22:18
SiDDD вне форума Посмотреть профиль Отправить личное сообщение для SiDDD Найти все сообщения от SiDDD
  № 6  
Ответить с цитированием
SiDDD

Регистрация: Oct 2006
Сообщений: 26
Драсти-приехали А как хорошо всё начиналось Тогда создам ещё одну тему... про String в роли массива. Можно да?

Старый 16.10.2006, 22:31
BigDan вне форума Посмотреть профиль Отправить личное сообщение для BigDan Найти все сообщения от BigDan
  № 7  
Ответить с цитированием
BigDan
 
Аватар для BigDan

Регистрация: Apr 2006
Адрес: Kiev
Сообщений: 1,675
Отправить сообщение для BigDan с помощью ICQ
Массив в AS нельзя считать полноценным массивом, так как массив AS -это обьект с набором свойств(елементы "массива"). Возможно по этому так нельзя делать. Можно сделать так arr2=arr1, только в данном случае массив arr2 можно считать ссылкой на массив arr1, при изменении значения в массиве arr1 оно же будет менатся в массиве arr2, но можно менять елементы массива arr2 и эти изменения никак не повлияют на массив arr1.

Старый 16.10.2006, 23:18
SiDDD вне форума Посмотреть профиль Отправить личное сообщение для SiDDD Найти все сообщения от SiDDD
  № 8  
Ответить с цитированием
SiDDD

Регистрация: Oct 2006
Сообщений: 26
Цитата:
Сообщение от BigDan
Массив в AS нельзя считать полноценным массивом, так как массив AS -это обьект с набором свойств(елементы "массива"). Возможно по этому так нельзя делать. Можно сделать так arr2=arr1, только в данном случае массив arr2 можно считать ссылкой на массив arr1, при изменении значения в массиве arr1 оно же будет менатся в массиве arr2, но можно менять елементы массива arr2 и эти изменения никак не повлияют на массив arr1.
В том то и дело, что изменения в arr2 ещё как влияют на arr1. Ведь из ваших же слов - arr2 только ссылка на arr1 а не его копия.

Старый 16.10.2006, 22:45
SiDDD вне форума Посмотреть профиль Отправить личное сообщение для SiDDD Найти все сообщения от SiDDD
  № 9  
Ответить с цитированием
SiDDD

Регистрация: Oct 2006
Сообщений: 26
Благодарю за ответы! Даж не ожидал такой отзывчивости Признаюсь мануал читал а ангийским владею к сожалению не безупречно, потому и подумал - не упустил ли какой "секретной" функции. И сторонние книжечки перелистал не раз. Вот уперлось вощщем всё в эти массивы и точка... Пробую разные варианты - некоторые привел как пример. Ваши советы работают - но важна максимальная производительность.

Старый 16.10.2006, 23:30
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 10  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
Можно копировать объекты с помощью класса mx.utils.ObjectCopy

посмотрите в классах поставляемых с флэшом документацию ( не в документации, а документацию в классе - комментарии)
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 12:18.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.