I had a typo in the post for a line in the setup function. The line: "[v:" + vItemNo + " i:" + itemNo + " a: " + aItemNo + " e: " + eItemNo + "]"
should be: "[v:" + pageNo+ " i:" + itemNo + " a: " + aItemNo + " e: " + eItemNo + "]" - rod --- In [email protected], "Rod Perkins" <[EMAIL PROTECTED]> wrote: > > > I have been having a great time using ActionScript 3.0 and Flex but > I have encountered problems which seem to be caused by Flexbuilder > or the Flashplayer runtime. The following problem is based on a > situation I have in my application uses a data structure of embedded > objects. I replicated the problem using arrays instead of the > classes I had used. The example may seemed contrived but reproduces > the problem without duplicating the complexity of my application. > > The structure was based on data structure of page objects, which > contains several cell items. Each item has a list of animations, > and each animation has a list trigger events references. So the > nested structure looked like the following: > > Pages (instance 1) > Item (instance 1) > Animation (instance 1) > Events (instance 1) > Events (instance 2) > Animation (instance 2) > Events (instance 1) > Events (instance 2) > Item (instance 2) > Animation (instance 1) > Events (instance 1) > Events (instance 2) > Animation (instance 2) > Events (instance 1) > Events (instance 2) > > The setup function in my example creates this structure using > arrays. The function "goodResult" traverses the structure using > nested for-loops. Nested local variables at different scoping > levels are referenced and displayed during the inner most loop for > the Events (instance 1 & 2). This produces the expected result. > Good Results > 500 200 [v:0 i:0 a: 0 e: 0] > 500 200 [v:0 i:0 a: 0 e: 1] > 500 200 [v:0 i:0 a: 1 e: 0] > 500 200 [v:0 i:0 a: 1 e: 1] > 500 200 [v:0 i:1 a: 0 e: 0] > 500 200 [v:0 i:1 a: 0 e: 1] > 500 200 [v:0 i:1 a: 1 e: 0] > 500 200 [v:0 i:1 a: 1 e: 1] > > The "badResult" function traverses the structure using the OO > technique of enumeration (iterator) functions. Among other reasons, > I used this approach to make the code more readable and compact by > hiding the loop from the caller and the typecasting the values > automatically. The caller is required to send a Function which is > then called during each pass (iterator) ofthe loop. The nested > local variables this time are not displayed properly. During the > first call, the results for Events (instance 1) is correct, but > Events (instance 2) is incorrect. Subsequent calls to > the "badResult" function display erroneous results. > > Bad Results - first iteration - first event loop good, second loop > bad > 500 200 [v:0 i:0 a: 0 e: 0] > 500 200 [v:0 i:0 a: 0 e: 1] > 500 200 [v:0 i:0 a: 1 e: 0] > 500 200 [v:0 i:0 a: 1 e: 1] > 500 59369881 [v:0 i:1 a: 0 e: 0] > 500 59369881 [v:0 i:1 a: 0 e: 1] > 500 59369881 [v:0 i:1 a: 1 e: 0] > 500 59369881 [v:0 i:1 a: 1 e: 1] > Bad Results - second iteration - both loops bad > 2 500 [v:0 i:0 a: 0 e: 0] > 2 500 [v:0 i:0 a: 0 e: 1] > 2 500 [v:0 i:0 a: 1 e: 0] > 2 500 [v:0 i:0 a: 1 e: 1] > 2 500 [v:0 i:1 a: 0 e: 0] > 2 500 [v:0 i:1 a: 0 e: 1] > 2 500 [v:0 i:1 a: 1 e: 0] > 2 500 [v:0 i:1 a: 1 e: 1] > Bad Results - third iteration - both loops bad > 2 500 [v:0 i:0 a: 0 e: 0] > 2 500 [v:0 i:0 a: 0 e: 1] > 2 500 [v:0 i:0 a: 1 e: 0] > 2 500 [v:0 i:0 a: 1 e: 1] > 2 500 [v:0 i:1 a: 0 e: 0] > 2 500 [v:0 i:1 a: 0 e: 1] > 2 500 [v:0 i:1 a: 1 e: 0] > 2 500 [v:0 i:1 a: 1 e: 1] > > I don't know if the problem is with the enumeration function calls > or stack references during nested scope (this is not recursion so > the stack depth should not be that great). The example is simple so > you can play around with it. It does make me worry about using > Functions or nested function calls. > > Here is the code for the example. > > Regards, > > Rod Perkins > > --------------------------- > package > { > > import flash.display.Sprite; > import flash.events.Event; > > public class BuildError_2 extends Sprite > { > private var _pages : Array = new Array(); > > public function enumerateEvents( _events : Array, func : > Function ) : void > { > for ( var x : int = 0, numItems : int = > _events.length; x < _events.length; x++) > { > var eventObj : Object = Object( > _events[x] ); > if (func.call( this, x, numItems, > eventObj ) == false) break; > } > } > > public function enumerateAnimations( _anim : Array, func : > Function ) : void > { > for ( var x : int = 0, numItems : int = > _anim.length; x < _anim.length; x++) > { > var animObj : Object = Object( _anim > [x] ); > if (func.call( this, x, numItems, > animObj ) == false) break; > } > } > > public function enumerateItems( _items : Array, > func : Function ) : void > { > for ( var x : int = 0, numItems : int = > _items.length; x < numItems; x++) > { > var itemObj : Object = _items[x]; > if (func.call( this, x, numItems, > itemObj ) == false) break; > } > } > > > public function setup() : void > { > _pages = new Array(); > for ( var pageNo : int = 0; pageNo < 1; > pageNo++) > { > var _items : Array = new > Array(); > for ( var itemNo : int = 0; > itemNo < 2; itemNo++) > { > var _anim : Array = > new Array(); > for ( var aItemNo : > int = 0; aItemNo < 2; aItemNo++) > { > > var > _events : Array = new Array(); > for ( var > eItemNo : int = 0; eItemNo < 2; eItemNo++) > { > > > _events.push( > > "[v:" + vItemNo + " i:" + itemNo + " a: " + aItemNo + " e: " > + eItemNo + "]" > ); > } > _anim.push( > _events ); > } > _items.push( _anim ); > } > _pages.push( _items ); > } > } > > public function verifyContainer( container : > Array ) : void > { > enumerateItems > ( > container, > function myContainerFunction( > itemNo : int, numItems : int, items : Array ) : Boolean > { > var itemCount : int = 500; > > enumerateAnimations > ( > items, > function > myAnimationFunction( animNo : int, numItems : int, anim : Array ) : > void > { > var > animationDuration : int = 200; > > > enumerateEvents > ( > anim, > > function myEventFunction( eventNo : int, numItems : int, > event : Object ) : void > { > > trace( itemCount + " " + animationDuration + " " + event); > } > ); > } > ); > > return true; > } > ); > > } > > public function goodResults() : void > { > for ( var pageNo : int = 0; pageNo < > _pages.length; pageNo++) > { > var _items : Array = _pages[ > pageNo ] as Array; > for ( var itemNo : int = 0; itemNo < > _items.length; itemNo++) > { > var itemCount : int = 500; > > var _anim : Array = _items[ > itemNo ] as Array; > for ( var aItemNo : int = 0; > aItemNo < _anim.length; aItemNo++) > { > > var > animationDuration : int = 200; > > var _events : Array > = _anim[ aItemNo ] as Array; > for ( var eItemNo : > int = 0; eItemNo < _events.length; eItemNo++) > { > > trace( > itemCount + " " + animationDuration + " " + _events[eItemNo] ); > } > } > } > } > } > > public function badResults() : void > { > for ( var index : int = 0; index < > _pages.length; index++) > { > var container : Array = _pages > [index] as Array; > > verifyContainer( container ); > } > } > > public function BuildError_2() > { > setup(); > > trace("Good Results" ); > // this path will print good results > // 500 200 > // 500 200 > // 500 200 > // 500 200 > // 500 200 > // 500 200 > // 500 200 > // 500 200 > goodResults(); > > trace("Bad Results - first iteration - first > event loop good, second loop bad" ); > // this path will print bad results > // 500 200 > // 500 200 > // 500 200 > // 500 200 > // 500 59435417 > // 500 59435417 > // 500 59435417 > // 500 59435417 > badResults(); > > trace("Bad Results - second iteration - both > loops bad" ); > // this path will print worse results > traversing the same structure > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > badResults(); > > trace("Bad Results - third iteration - both > loops bad" ); > // this path will print the same results as > the second iteration > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > // 2 500 > badResults(); > } > } > } > > Rod Perkins > Principle Architect & Designer > Yahoo! Inc. > 701 First Avenue > Sunnyvale, CA 94089 > 408.349.2766 (tel) > 409.349.7170 (fax) > [EMAIL PROTECTED] >

