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

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

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

Регистрация: Apr 2010
Сообщений: 4
По умолчанию Ошибка при многократном вызове функции сортировки массива

День добрый.

Краткое описаниее проблемы:
Есть массив currentItems, в котором есть какие-то случайные числовые значения. Его надо присвоить трем переменным и перемешать каждую из них в случайном порядке.
Реализовано так: для каждой из переменных получаю массив со случайными индексами от 1 до 1000 (getIndexes()), после чего эти же переменные отдаю на сортировку (sortArray()).

А после того, как вывожу получившийся результат (после трех вызовов sortArray()), все переменные принимают значение последнего вызова функции sortArray(). Причем, если выводить внутри самой sortArray(), то все нормально.

Код AS1/AS2:
var currentItems:Array = new Array();// Select items, that will use in the game.
 
var items1:Array = new Array();
var items2:Array = new Array();
var items3:Array = new Array();
 
var count = 22;
 
 
function formArray(num:Number) {
	for (i = 0; i < num; i++) {
		//trace(currentItems[i]);
		currentItems[i] = random(count);
	}
 
}
 
function getIndexes(num:Number) {
	var indexes:Array = new Array();
	for (i = 0; i < num; i++) {
		indexes[i] = random(1000);
		//trace(i);
	}
	return indexes;
}
 
function sortArray(inp:Array){
 
	var tmp:Number = new Number();
	var sortArr = currentItems;
	for (i = 0; i < inp.length; i++) {
		//trace("");
		for (k = i; k < inp.length; k++) {
			if (inp[k] < inp[i]) {
				tmp = inp[i];
				inp[i] = inp[k];
				inp[k] = tmp;
 
 
				tmp = sortArr[i];
				sortArr[i] = sortArr[k];
				sortArr[k] = tmp;
			}
		}
	}
	trace("sortArr: " + sortArr);
	return sortArr;
}
 
formArray(9);
trace("Array: "+ currentItems);
trace("");
trace("Get random indexes");
items1 = getIndexes(currentItems.length);
items2 = getIndexes(currentItems.length);
items3 = getIndexes(currentItems.length);
trace(items1);
trace(items2);
trace(items3);
trace("Sorted indexes");
items1 = sortArray(items1);
items2 = sortArray(items2);
items3 = sortArray(items3);
trace(items1);
trace(items2);
trace(items3);
Пример вывода:
Код:
Array: 18,13,3,12,12,5,20,21,16

Get random indexes
17,924,517,925,887,321,758,237,492
440,773,456,730,540,370,82,483,968
831,138,374,541,31,507,194,529,48
Sorted indexes
sortArr: 18,21,5,16,3,20,12,13,12
sortArr: 12,20,18,5,13,3,16,21,12
sortArr: 13,12,20,16,18,3,21,5,12
13,12,20,16,18,3,21,5,12
13,12,20,16,18,3,21,5,12
13,12,20,16,18,3,21,5,12
Три строчки «SortArr: xxxxxxxxx» — это вывод из самой функции перед тем, как она вернет свое значение.

Причем если выводить значения переменных после каждого вызова функции, то выводятся адекватные значения. Но после того как функция вызвана 3 раза, все переменный берут значения последнего вызова.
Код AS1/AS2:
items1 = sortArray(items1);
trace(items1);
items2 = sortArray(items2);
trace(items2);
items3 = sortArray(items3);
trace(items3);
trace("");
trace(items1);
trace(items2);
trace(items3);
Пример вывода:
Код:
Array: 14,15,14,15,16,18,19,2,4

Get random indexes
802,963,768,426,203,828,752,458,658
184,43,693,465,677,591,421,321,99
632,947,952,722,619,849,559,72,87
Sorted indexes
sortArr: 16,15,2,4,19,14,14,18,15
16,15,2,4,19,14,14,18,15
sortArr: 15,15,16,18,14,4,14,19,2
15,15,16,18,14,4,14,19,2
sortArr: 19,2,14,14,15,18,4,15,16
19,2,14,14,15,18,4,15,16

19,2,14,14,15,18,4,15,16
19,2,14,14,15,18,4,15,16
19,2,14,14,15,18,4,15,16
Чтобы не было ощущения абстрактного примера: currentItems — это выборка случайных элементов из массива с данными длинной count.

Есть способ заствить переменные принимать реально возвразаемые значения функции, а не ее последнего вызова?

Спасибо всем, кто откликнется.

Старый 15.04.2010, 13:32
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 2  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Код AS1/AS2:
var sortArr:Array = [].concat(currentItems);
Сложные типы передаются по ссылке, а не по значению.

Старый 15.04.2010, 13:40
abugaev вне форума Посмотреть профиль Отправить личное сообщение для abugaev Найти все сообщения от abugaev
  № 3  
Ответить с цитированием
abugaev

Регистрация: Apr 2010
Сообщений: 4
Большое спасибо, не знал.

Проблема решена.

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

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

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


 


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


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