Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Изменение элемента двумерного массива (http://www.flasher.ru/forum/showthread.php?t=174281)

PNATd 21.01.2012 18:34

Изменение элемента двумерного массива
 
Создаю в Action Script двумерный массив Arr, заполняю его числовыми данными. Затем мне требуется менять эти данные. Пробую сделать это командой Arr[1][1] = 5, в результате все значения второго столбца, а не только второй ячейки меняются на 5. Что я делаю неправильно, и как менять значения в двумерном массиве?

Zebestov 21.01.2012 19:26

Покажи, как создаешь и заполняешь двумерный массив.

PNATd 21.01.2012 21:27

Я создала специальную программу для проверки, чтобы избежать влияния посторонних ошибок. Происходит то же самое.
Создание и заполнение массива следующее:
Код AS3:

var Arr:Array = new Array();
var Arr2:Array = new Array();
for (var i:Number=0; i<5; i++)
{
        for (var j:Number=0; j<5; j++)
        {
                Arr[j] = 5;
        }
        Arr2[i] = Arr;
}

Trace выводит массив, заполненный числами 5. После команды
Код AS3:

Arr2[0][0] = 1;

массив принимает следующий вид:
1,5,5,5,5
1,5,5,5,5
1,5,5,5,5
1,5,5,5,5
1,5,5,5,5

iNils 21.01.2012 21:43

Массив, это объект. А все объекты передают на себя ссылки, а не значения.
Поэтому, все элементы массива Arr2, хранят в себе ссылки на массив Arr.
Поэтому, нужно делать так:
Код AS3:

var arr:Array = [];
for (var i:Number = 0; i < 5; i++) {
        arr[i] = [];
        for (var j:Number=0; j<5; j++) {
                arr[i][j] = 5;
        }
}
arr[0][0] = 1;

PS. В ActionScript принято писать названия переменных с маленькой буквы.

PNATd 21.01.2012 21:59

Все заработало. Спасибо за помощь!

wvxvw 21.01.2012 22:12

Если максимальный размер двухмерного массива не критичен, то я бы имитировал двумерные массивы через один одномерный, но с доступом и чтением по формуле i * w + j, где i - смещение по вертикали, w - количество колонок, j - смещение по горизонтали. Таким образом можно избежать создания лишних вложенных массивов.

GBee 21.01.2012 22:20

wvxvw, а есть еще плюсы вашего подхода, кроме избегания создания лишних массивов?

iNils 21.01.2012 22:20

Цитата:

Сообщение от wvxvw (Сообщение 1058340)
Если максимальный размер двухмерного массива не критичен, то я бы имитировал двумерные массивы через один одномерный, но с доступом и чтением по формуле i * w + j, где i - смещение по вертикали, w - количество колонок, j - смещение по горизонтали. Таким образом можно избежать создания лишних вложенных массивов.

При возрастании массива, это приведет к проблемам.

silin 21.01.2012 23:17

>>При возрастании массива, это приведет к проблемам.
а кто-нибудь мерял-тестил на каких длинах начинаются проблемы ?
и да: а каких проблем тут ждать

Zebestov 21.01.2012 23:29

:D речь, наверное, шла об увеличении количества столбцов


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

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