Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Ошибка при многократном вызове функции сортировки массива (http://www.flasher.ru/forum/showthread.php?t=138751)

abugaev 15.04.2010 13:22

Ошибка при многократном вызове функции сортировки массива
 
День добрый.

Краткое описаниее проблемы:
Есть массив 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.

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

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

udaaff 15.04.2010 13:32

Код AS1/AS2:

var sortArr:Array = [].concat(currentItems);

Сложные типы передаются по ссылке, а не по значению.

abugaev 15.04.2010 13:40

Большое спасибо, не знал.

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


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

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