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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.07.2013, 18:15
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 21  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
iNils прошу прощения. А где элемент с индексом 't'?
Код AS3:
var s:Array = new Array();
	s[1] = true;
	s[2] = true;
	s[5] = true;
 
	s['t'] = true;
 
 
for ( var i=0; i<s.length; i++ ){
	trace(i+" > "+s[i]);
}
 
/*
0 > undefined
1 > true
2 > true
3 > undefined
4 > undefined
5 > true
*/
__________________
return this...

Старый 22.07.2013, 20:11
WisP вне форума Посмотреть профиль Отправить личное сообщение для WisP Найти все сообщения от WisP
  № 22  
Ответить с цитированием
WisP

Регистрация: Sep 2003
Сообщений: 28
Цитата:
Сообщение от AlexLucas Посмотреть сообщение
Не нельзя, а не рекомендуется, раз ошибку не выдаёт - значит можно. И результат в том случае всегда будет 0.
Могу только предложить обратиться к словарю.

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от AlexCooper Посмотреть сообщение
iNils прошу прощения. А где элемент с индексом 't'?
А он разве там должен быть? Вы справку читали? Если вы возьмете молоток, и начнется вместо гвоздя бить по пальцу, то тоже скажите, что молоток не работает? У Array есть четкая логика работы с элементами массива. Индекс элемента - число. Длина массива, это не количество добавленных туда элементов, это число элементов между последним и первым индексами. Потому что массив непрерывен. И даже, если вы туда что-то не поместили, ячейка резервируется.

У MovieClip нет свойства length, но можно написать так
Код AS3:
var m:Array = new MovieClip();
m['t'] = true;
Ничего не напоминает? Может MovieClip тоже не правильно работает?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
iNils Согласен с Вами и признаю что считал запись вида
Код AS3:
var m:Array = new Array();
m['t'] = true;
как запись в массив значения с индексом t. Но в свою очередь не использую такой подход, может на ранних этапах программирования, потому и предположил что подобную ошибку мог допустить ТС.
__________________
return this...

Старый 23.07.2013, 01:30
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 25  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
Сообщение от AlexCooper Посмотреть сообщение
Хм... то-есть по Вашим словам этот массив не имеет элементов?
Код AS3:
var arr:Array = new Array();
arr['test'] = Math.random();
 
trace(arr.length); // 0
Когда говорят о массиве, то подразумевают определенную структуру данных. Такая структура характеризуется тем, что помимо всего прочего в ней все элементы упорядочены (линейно упорядоченое множество) когда вы записываете в массив что-то по индексу "вася", то вы должны определится с вопросом: находится ли индекс "вася" раньше индекся N, или нет. Т.как вы этого не можете сделать (либо "вася" будет равен какому-нибудь числу N, либо ваш массив перестанет быть линейно упорядоченным).
Поведение которое вы видите не типично для массивов вообще, и является случайным артефактом, продуктом наследования + специфики реализации динамического доступа. Лучше об этом думать как о методе `[]` определенном на классе Array таким образом, что будучи вызваным со строкой в качестве индекса не вернет элемент по индексу, а значение динамически созданного свойства.
__________________
Hell is the possibility of sanity

Старый 23.07.2013, 08:41
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 26  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Вспомнился давний холивар на тему "массивы в AS индексируются строками". Что-то тогда много всякого наговорили.. правда, AS 3.0 тогда еще не было вроде даже.

Код AS3:
var arr:Array = new Array();
arr['0'] = 123456; 
trace(arr.length); // 1
trace(arr[0]); //123456
UPD. Пардон, вот оно, тем более поностальгировать: ActionScript - полная лажа" или "Как не надо делать интерпретаторы"

Старый 23.07.2013, 09:05
FlashRus вне форума Посмотреть профиль Отправить личное сообщение для FlashRus Найти все сообщения от FlashRus
  № 27  
Ответить с цитированием
FlashRus
 
Аватар для FlashRus

Регистрация: Nov 2006
Адрес: СПб
Сообщений: 921
Отправить сообщение для FlashRus с помощью ICQ Отправить сообщение для FlashRus с помощью Skype™
Цитата:
А как по вашему работает геттер get length?
Он не пересчитывает элементы каждый раз.

Код:
uint32 ArrayObject::get_length() const { 
	return getLength(); 
}

/*virtual*/ uint32 ArrayObject::getLength() const {
	return m_length;
}
Добавлено через 1 час 58 минут
Код:
uint32 ArrayObject::AS3_push(Atom* argv, int argc) {
	if (isSimpleDense()) {
		m_denseArr.push (argv, argc);
		m_length += argc;
	} else {
		for (int i=0; i < argc; i++) {
			_setUintProperty(getLength(), argv[i]);
		}
	}
	return m_length;
}
"m_length += argc;" - новая длина массива собственной персоны


Добавлено через 2 часа 58 минут
Результаты тестов:

0 => 987, 987, 0
1000 => 987, 987, 0
10000000 => 1929, 1929, 0


Код AS3:
addEventListener(MouseEvent.CLICK, clickHandler)
var arr:Array = [];
var currLength:int;
var t0:int;
var t1:int;
var i:int;
 
function clickHandler(e:MouseEvent):void {
	calculateAndAppendData()	
	for (i = 0; i < 1000; i++) {
		arr.push(Math.random())
	}
	calculateAndAppendData();
	arr = [];
	for (i = 0; i < 10000000; i++) {
		arr.push(Math.random())
	}
	calculateAndAppendData();
}
 
function calculateAndAppendData():void {
	t0 = getTimer();
	currLength = arr.length;
	t1 = getTimer();
	tf.appendText(currLength + " => " + t0 + ", " + t1 + ", " + (t1 - t0) + "\n");
}


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

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

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


 


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


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