Форум 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=106392)

Орец 10.01.2008 17:09

Заполнение из текстового файла многомерного ассоциативного массива
 
Возникла необходимость на первом кадре заполнить из текстового файла многомерный ассоциативный массив для того чтобы в дальнейшем к нему обращаться. Отдельно с загрузкой переменных из текстового файла и созданием массивов я разобрался, но достигнутые успехи обо что-то споткнулись и не помогли. Проблем две. Первая - почемуто после заполнения первой строчки массива остальные не заполняются, хотя видно что отработка проходит. Вторая - получается увидеть результат только обращаясь к массиву из самой функции. Мне вообще в виде функции обработчик не нужен, но почему-то работает только там.

Текстовый файл имеет вид таблицы, с разделителями полей символами табуляции, в начало первого поля дописанно "ls=".

Код:

loadVariables("BD.txt", "_root");
lv = new LoadVars();
lv.load("BD.txt");
lv.onLoad= function ()
//if (lv.onLoad)
{
var massiv1:Array = ls.split("\r\n"); //-создаётся массив каждое значение которого содержит строку из файла
var mass:Array;
var massiv:Array;
massiv = new Array(massiv1.length);
for (var i =0; i<massiv1.length; i++)
{
mass = massiv1[0].split("        "); //-разбивка строки на подстроки по символам табуляции
massiv[mass[0]]=mass;//-запись строки разбитой на подстроки в многомерный массив. С именем равным значению первого поля в строке.
}
trace(lv);//-тут выводится целиком файл в нечитаемой кодировке.
trace('***************');
trace(ls);//-тут выводится переменная ls в которую введён весь файл
trace('Число строк массива massiv1= ' +massiv1.length); // 22
trace('Число строк массива massiv= ' +massiv.length);// 2551
trace('Число i= ' +i);//  22
trace('***************');
trace('Первая строка: '+massiv['02550']); //- выводит этот вложенный массив.(Первая строка файла)
trace('***************');
trace('Вторая строка: '+massiv['r2-1']); //-ничего хорошего(должна быть вторая строка)
}


chingachgoog 10.01.2008 17:27

Забавное имя: 'r2-1' :)

Орец 10.01.2008 17:34

Цитата:

Сообщение от chingachgoog
Забавное имя: 'r2-1' :)

Большинство имён -цифровой номер. Там где у объекта нет номера, но сам он присутствует идентификатор пришлось придумывать, в данном случае он обозначает, что это первый нестандартный объект со второй страницы. :)

chingachgoog 10.01.2008 17:53

Есть четкие правила допустимых имен переменных, именно поэтому я назвал имя 'r2-1' забавным.

Орец 10.01.2008 18:15

Вложений: 1
Совсем забыл. Текстовый файл из которого заполняется массив приложен. Если кто знает как заставить правильно работать - напишите об этом тут! ;)

Орец 28.01.2008 12:06

Что-то тема совсем уползла. :rolleyes:
Ладно пока-что решил создавать матрицу в экселе и вставлять в код. Изменять значения не придётся, только добавлять новые строки. Так что не критично.
Но узнать решение было бы интересно. Вдруг потом пригодится когда.

chingachgoog 28.01.2008 13:16

Код:

arr=[]
arr['02550']=321
arr['r2-1']=123
trace(arr['02550']+" "+arr['r2-1'])

Ошибки нет. Но в данном случае это особенность создания массивов во флеше. По сути "настоящих" массивов во флеше нет. Есть некая имитация массивов и массив во флеше - это просто объект у которого есть дополнительное свойство length.
А сами объекты во флеше - это ассоциативные массивы или множества.

Цитата:

Сообщение от Гурский
При реализации множеств используются идеи хэш-кодирования. Поэтому их часто называют хэшами. ...Адресом нужного объекта данных является его имя. Дело в том, что любую строковую последовательность можно представить как число. Опираясь на это число, можно выделить для объекта данных область памяти с определенным адресом. Именно
это и делается при создании элемента хэша. Затем, при обращении к элементу, нужно лишь повторно вычислить по переданному имени адрес в памяти, который он занимает. Функция, преобразующая строковые последовательности в адреса в хэш-таблице, называется хэш-функцией.

Т.е. 'r2-1' в массиве arr - это не переменная 'r2-1' (см. в хелпе главу именование переменных), а строковый адрес ячейки массива.

Орец 28.01.2008 15:05

дело в том что если дать иное название, работать от этого функция не начинает :)
Впрочем если прописать в ручную то всё работает.
Вот и хоетелось бы понять, почему в ручную имитация многомерного ассоциативного массива создаётся, а в моей функции из текстового файла не хочет :(

alexcon314 28.01.2008 15:45

я не совсем понял каким образом вы формируете эти самые массивы, но тем не менее исправил ряд ошибок в вашем коде (надеюсь, что новых не добавил:))
Код:

//loadVariables("BD.txt", "_root");
lv = new LoadVars();
lv.load("BD.txt");
lv.onLoad = function() {
        var massiv1:Array = lv.ls.split("\r\n");
        //-создаётся массив каждое значение которого содержит строку из файла
        var mass:Array = [];
        var massiv:Array = [];
        massiv = new Array(massiv1.length);
        for (var i = 0; i < massiv1.length; i++) {
                mass = massiv1[i].split("\t");
                //-разбивка строки на подстроки по символам табуляции
                massiv[mass[0]] = mass;
                //-запись строки разбитой на подстроки в многомерный массив. С именем равным значению первого поля в строке.
        }
        //trace(lv);
        //-тут выводится целиком файл в нечитаемой кодировке.
        trace('***************');
        trace(lv.ls);
        //-тут выводится переменная ls в которую введён весь файл
        trace('Число строк массива massiv1= ' + massiv1.length);
        // 22
        trace('Число строк массива massiv= ' + massiv.length);
        // 2551
        trace('Число i= ' + i);
        //  22
        trace('***************');
        trace('Первая строка: ' + massiv['02550']);
        //- выводит этот вложенный массив.(Первая строка файла)
        trace('***************');
        trace('Вторая строка: ' + massiv['r2-1']);
        //-чегото хорошее появилось:):):):)
};


chingachgoog 28.01.2008 17:15

alexcon314 верно нашел ошибку:

вместо
Код:

for (var i =0; i<massiv1.length; i++) {
mass = massiv1[0].split("        "); //-разбивка строки на подстроки по символам табуляции
...

надо конечно же

Код:

for (var i =0; i<massiv1.length; i++){
                mass = massiv1[i].split("        "); //-разбивка строки на подстроки по символам табуляции

Но самым прикольным, конечно же оказался код задания ассоциативного массива:
Код:

massiv[mass[0]]=mass;
где mass[0] - это строка


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

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