PDA

Просмотр полной версии : Баг Array или как это работает?


Heavy
21.02.2011, 18:49
Собственно сталкнулся с странной штукой и хотел спросить как это работает.

txt:Array = new Array(1, 'Vasia', 2, 'Petia', 3, 'Kolia');
adres:int = 0;

while (txt[adres] <= txt[txt.length - 2]) //Незапускается
{ ...
adres += 2;
}


txt:Array = new Array(1, 'Vasia', 2, 'Petia', 3, 'Kolia');
adres:int = 0;

while (txt[adres] <= 3) // Запускается
{ ...
adres += 2;
}


txt:Array = new Array(1, 'Vasia', 2, 'Petia', 3, 'Kolia');
adres:int = 0;

while (txt[adres] <= parseInt(txt[txt.length - 2])) //Тоже заработало
{ ...
adres += 2;
}

Собственно не понятно почему txt[adres] является числом для сравнения, а txt[txt.length - 2] числом какбудно не является, хотя тип значения одинаковый.

Psycho Tiger
21.02.2011, 19:19
Ну Вы бы хоть ошибку привели.

mikhailk
21.02.2011, 19:39
txt:Array = new Array(1, 'Vasia', 2, 'Petia', 3, 'Kolia');


Выкиньте по возможности книжку, где посоветовали так делать.
Что в итоге-то надо?

Heavy
21.02.2011, 19:39
Ошибки нету, доходит до цикла и пропускает его, как будто условия не соблюдены и выполняет программу далее.
Кстате если протрейсить перед циклом:trace(txt[txt.length - 2]) // 3

i.o.
21.02.2011, 19:40
Разве это не должно вообще зависнуть??

txt:Array = new Array(1, 'Vasia', 2, 'Petia', 3, 'Kolia');
adres:int = 0;

while (txt[adres] <= txt[txt.length - 2]) //Незапускается
{ ...
adres += 2;
}

alatar
21.02.2011, 19:40
Array нетипизированный массив и компилятор понятия не имеет, что у него внутри.
Так тоже заработало бы:
Number(txt[txt.length - 2])
или так:
int(txt[txt.length - 2])

i.o.
21.02.2011, 19:42
сорри, не заметил adres += 2;
бывает.. )

Heavy
21.02.2011, 19:42
а почему у txt[adres] не придерается к типу?

Psycho Tiger
21.02.2011, 19:43
alatar, в этом и суть. Он не знает что внутри, поэтому все обращения осуществляются динамическим доступом, который не проверяется компилятором. Поэтому и непонятно, почему не заработало

Heavy
21.02.2011, 19:44
Выкиньте по возможности книжку, где посоветовали так делать.
Что в итоге-то надо?
В общем, там создаются объекты с данными именами, ну и естественно это общий вид. Возможно есть более правильный способ, но я его пока не знаю.

i.o.
21.02.2011, 19:46
а у меня так работает..

doTest();


function doTest():void
{
var txt:Array = new Array(1, 'Vasia', 2, 'Petia', 3, 'Kolia');
var adres:int = 0;

while( txt[adres] <= txt[txt.length - 2] )
{
trace( "while on " + adres );

adres += 2;
}
}

трейс:

while on 0
while on 2
while on 4

in4core
21.02.2011, 19:48
[['vasya',333]]

or

obj['vasya'] = 333

Не лучше ли так ? Если я верно понял задачу

i.o.
21.02.2011, 19:54
не лучше ли сразу так?
[ 'Vasia', 'Petia', 'Kolia' ];

alatar
21.02.2011, 19:54
Кстати только что проверил, работает первоначальный вариант без проблем.

Heavy
21.02.2011, 19:57
а у меня так работает..

doTest();


function doTest():void
{
var txt:Array = new Array(1, 'Vasia', 2, 'Petia', 3, 'Kolia');
var adres:int = 0;

while( txt[adres] <= txt[txt.length - 2] )
{
trace( "while on " + adres );

adres += 2;
}
}

трейс:

а это странно. у меня FD не запускает цикл.

Psycho Tiger
21.02.2011, 20:19
Ну что же он пишет, почему не запускает? Т_Т

Heavy
21.02.2011, 20:24
Он просто пропускает цикл как при не соблюдении условий, и выполняет код далее после цикла...

Psycho Tiger
21.02.2011, 21:58
Грустно.
var txt:Array=["vasia","petya","fedya"];
var i:int=txt.length;
while (i--) trace("While on",txt[i],i);