PDA

Volledige versie bekijken : Géén 'index out of bounds' ?


Dauntless
%Europe/Berlin %491 %2007, 12:48
Hey FF,

Naar aanleiding van dit topic:
http://www.flashfocus.nl/forum/showthread.php?t=34692
zocht ik nog een paar redenen om -1 te gebruiken. Ik had gedacht dat dit een leuke zou zijn:
var ar:Array = new Array("Hello", "World");
trace(ar[-1]);
trace(ar[undefined]);
Ik had verwacht dat de eerste een 'index out of bounds' zou geven, terwijl de tweede in stilte zou falen. De traces zijn echter beide undefined. Waar om geeft flash geen index out of bounds error ?

Greets,
DL

BernardV
%Europe/Berlin %511 %2007, 13:17
Nog leuker:P
var ar:Array = new Array("Hello", "World");
trace(ar[-1]);
trace(ar.length);
ar[-1] = "test";
trace(ar[-1]);
trace(ar.length);

Komt denk ik door het feit dat je wel assoc arrays kunt maken in flash, alleen dan werken de standaard functies niet meer.

Dauntless
%Europe/Berlin %523 %2007, 13:33
Hoe kan je dan ooit die error triggeren ?

BernardV
%Europe/Berlin %543 %2007, 14:02
Het lijkt erop dat als een array buiten zijn min/max waardes komt deze echt raar gaat doen. Heb het getest in Flex en Flash CS3, zelfde resultaten:
var ar:Array = new Array("Test1","Test2");
trace(ar.length);
ar[4294967294] = "Test3";
trace(ar.length);
ar[4294967295] = "Test4";
trace(ar.length);

for(var i:String in ar) trace(i, ar[i]);

Output:
2
4294967295
0
0 Test1
1 Test2
4294967294 Test3
4294967295 Test4

matzo
%Europe/Berlin %551 %2007, 14:14
Dat is wel heel vreemd? Dus ook dan krijgen we geen 'out of bounds' error. Waarom bestaat die error dan??

En als je 4294967295 als index neemt, geeft hij als length terug nul, maar als je 42967296 geeft, geeft hij geen error, geen 0, geen 1, maar vreemd genoeg 4294967295?
var ar:Array = new Array("Test1","Test2");
trace("length 1:", ar.length);
ar[4294967294] = "Test3";
trace("length after adding element at 4294967294:", ar.length);
ar[4294967296] = "Test4";
trace("length after adding element at 4294967296:",ar.length);

for(var i:String in ar) trace("i:", i, "element value:", ar[i]);
/**output
length 1: 2
length after adding element at 4294967294: 4294967295
length after adding element at 4294967296: 4294967295
i: 0 element value: Test1
i: 1 element value: Test2
i: 4294967296 element value: Test4
i: 4294967294 element value: Test3
*/

BernardV
%Europe/Berlin %559 %2007, 14:26
Dan hebben we ook veel aan indexOf(); Kun je mooi een default waarde opgeven, hahaha :P
var ar:Array = new Array();
ar[-1] = "Test1";
ar[0] = "Test2";

var pos:Number = ar.indexOf("Test3");
trace(pos);
trace(ar[pos]);
Output:
-1
Test1

matzo
%Europe/Berlin %569 %2007, 14:40
Héhé slim bekeken BernardV, elk voordeel heb ze nadeel:D, maar of dát als voordeel zo zwaar kan tellen weet ik niet...:( Sterker nog, ik vind van niet:P Dit kan wel héél onverwachte resultaten geven, en lijkt me heel moeilijk om te debuggen. Tot dit is opgelost(want dit is, vind ik, toch wel de naam 'bug' waard) moet je dit goed onthouden lijkt me.
Je zou het maar hebben:), dat je een array vult via een for loop, maar per ongeluk je loop begint vanaf -1. Ik zou dan al een runtime error willen, maar nu kan dit zelfs voor problemen zorgen met indexOf...! [V]

BernardV
%Europe/Berlin %571 %2007, 14:43
Nog wat info over numbers in flash: http://vijayram.wordpress.com/2007/02/04/integer-overflow/

Héhé slim bekeken BernardV, elk voordeel heb ze nadeel:D
Was meer als grap bedoeld ;)

matzo
%Europe/Berlin %576 %2007, 14:49
Nog wat info over numbers in flash: http://vijayram.wordpress.com/2007/02/04/integer-overflow/


Was meer als grap bedoeld ;)
Wees gerust, dat had ik door;)
Leuke link trouwens:) Bedankt!