Toon posts:

[AS] Array copieëren in Flash

Pagina: 1
Acties:

Verwijderd

Topicstarter
Klein vraagje over actionscripting in Flash.

Ik heb een array aangemaakt, genaamd map1.
Nu heb ik het volgende geprobeerd:

currenMap = map1;

Maar nu is currentMap niet de array map1.
Hoe kan ik een array overcopieëren?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

goh zeg
waar zouden de flash topics moeten?
<h2>HTML, JavaScript en Flash topics</h2>

nah geen idee :{

Doet iets met Cloud (MS/IBM)


Verwijderd

misschien eerst een nieuwe array aanmaken en die gelijkstellen aan amp1?
of is het de typefout currenMap (zonder t)?

Verwijderd

Verwijderd schreef op 13 January 2003 @ 11:19:
Klein vraagje over actionscripting in Flash.

Ik heb een array aangemaakt, genaamd map1.
Nu heb ik het volgende geprobeerd:

currenMap = map1;

Maar nu is currentMap niet de array map1.
Hoe kan ik een array overcopieëren?
Een array kopieren is iets heel anders dan een referentie ernaar maken:

Flash ActionScript:
1
2
3
4
this.testArr = new Array('foo','bar');
this.refArr = this.testArr;
this.refArr[0] = 'werkt?';
trace(this.testArr[0]); // Traced:  Werkt?

Wat dus aantoont dat het alleen maar een referentie is.
Leg iets duidelijker uit wat je peciesss wil...

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

tis geen referentie, tis gewoon domweg een kopie. Zie hier:
[rml]oh,when? in "[ Flash] Array. Hele vage fout."[/rml]

:)

"You're only as good, as what you did last week."


Verwijderd

Check de voorbeeld code nogmaals...referentie op flasm gebied is hier wat anders.

Verwijderd

Even ter verduidelijking:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
this.testArr = new Array('foo','bar');
trace(this.testArr[0]);//Traced: Werkt ?

var n = this.testArr.length;
this.copyArr = new Array();

while(n--){
    this.copyArr[n] = this.testArr[n]; 
}

this.refArr = this.testArr;
this.refArr[0] = 'werkt?';


Dit komt eruit bij een debug:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
Level #0:
Variable _level0.$version = "WIN 6,0,61,0"
Variable _level0.testArr = [object #1, class 'Array'] [
    0:"werkt?",
    1:"bar"
  ]
Variable _level0.n = -1
Variable _level0.copyArr = [object #2, class 'Array'] [
    0:"foo",
    1:"bar"
  ]
Variable _level0.refArr = [object #1, class 'Array']


refArr = ook object 1....

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Verwijderd schreef op 13 January 2003 @ 15:07:
[...]
Check de voorbeeld code nogmaals...referentie op flasm gebied is hier wat anders.
tis wel degelijk een copy, en GEEN reference. Als ik een reference b maak, en ik zou b gaan wijzigen, dan zou a ook moeten wijzigen en dat is dus NIET het geval. :)

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a = [[1],[2]];
b = a;

a = [[3],[4]];

trace(a); // traced 3,4
trace(b); // traced 1,2 (klopt dit?)

// en nu andersom

a = [[1],[2]];
b = a;

b = [[3],[4]];

trace(a); // traced 1,2 (klopt dit?)
trace(b); // traced 3,4


kheb het nog ff in Java en php getest:

PHP:
1
2
3
4
5
6
7
$a = Array(1,2);
$b = &$a;
$a = Array(3,4);

echo "<pre>";
print_r($b);
echo "</pre>";
en output inderdaad 3, 4 zoals het hoort. kweet nu niet wat de expected behaviour is in Ecmascript, maar het gaat hier wel degelijk dus om een copy en geen reference.

"You're only as good, as what you did last week."


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

erm...kheb net weer het volgende getest:

Flash ActionScript:
1
2
3
4
5
6
7
a = [[1],[2]];
b = a;

a[1] = 3;

trace(a); // traced 1,3
trace(b); // traced 1,3 (erm?? huh? :D)


hier ga ik niks van snappen? :)

"You're only as good, as what you did last week."


Verwijderd

in ecma maak je alleen maar references aan.....nogmaals, de trace:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
Level #0:
Variable _level0.$version = "WIN 6,0,61,0"
Variable _level0.testArr = [object #1, class 'Array'] [
    0:"werkt?",
    1:"bar"
  ]
Variable _level0.n = -1
Variable _level0.copyArr = [object #2, class 'Array'] [
    0:"foo",
    1:"bar"
  ]
Variable _level0.refArr = [object #1, class 'Array']


Let dus vooral op deze regel:
Flash ActionScript:
1
Variable _level0.refArr = [object #1, class 'Array']


....... hij traced hem niet helemaal....het is nl een referentie...

[ Voor 108% gewijzigd door Verwijderd op 13-01-2003 15:47 ]


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

ja maar daar gaat het niet om, want zie mijn voorbeeld eerder gepost. zodra je van a een nieuwe array maakt, point b dus naar een ANDERE array, alleen als rechtstreeks een key aanspreekt en de value veranderd dan is b inderdaad een referentie. Zie ook het php voorbeeld waar het _wel_ goed gaat. Maar ik snap het momenteel ook niet en heb er hier nu ook niet echt tijd om er in te duiken...maar vaag vind ik het wel :)

"You're only as good, as what you did last week."


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a = Array("foo","bar");
b = a;
a = Array("referentie","referentie2");

trace(a); // traced referentie, referentie2
trace(b); // traced foo, bar? waar point deze dan naar toe?

delete a, b;

a = Array("foo","bar");
b = a;

a[0] = "referentie"; //direct aanspreken!
a[1] = "referentie2";

trace(a); // en zijn inderdaad hetzelfde?
trace(b); // en is dus een referentie.


kon het niet laten om ff te testen :D :) ralph? wat zeg jij :)

"You're only as good, as what you did last week."


Verwijderd

koel....leuke bug denk ik. Dit gaan we wat dieper checken....

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
kan het niet liggen tussen het verschil van [], Array en new Array?

Verwijderd

Het kan maybe wel een onderdeel zijn, maar het verklaart nooit alles.

Verwijderd

Ik weet vrij zeker dat het een reference moet zijn....
je zou het zo kunnen zien:

Flash ActionScript:
1
this.myArray_1 = new Array();


this.myArray_1 is daar al een reference naar het nieuw gecreerde object van de class array.

Als ik dan dit zou doen:
Flash ActionScript:
1
this.myArray_2 = this.myArray_1 = new Array();


Heb ik nu 2 references naar het zelfde array.
Dit staat op zijn beurt weer gelijk aan:

Flash ActionScript:
1
2
this.myArray_1 = new Array();
this.myArray_2 = this.myArray_1;


Ik denk dat dit ecma standaard is, en dat de ' bug' die owen nou heeft gevonden heeft meer verteld over de innerworkings dan dat je op de ecma compliant laag zou moeten zien.

  • edie
  • Registratie: Februari 2002
  • Nu online
Ook leuk (veranderde code van oh, when?):

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var a = new Array("foo","bar");
var b = new Array( a );

a = new Array("referentie","referentie2");

trace(a); // traced referentie, referentie2
trace(b); // traced foo, bar

delete a, b;

var a = new Array("foo","bar");
var b = new Array( a );

a[0] = "referentie"; //direct aanspreken!
a[1] = "referentie2";

trace(a); // en zijn inderdaad hetzelfde?
trace(b); // en is dus een referentie.

delete a, b;

// Maar als ik doe:
var a = new Array("foo","bar");
var b = new Array( a );

b[0] = "referentie"; //direct aanspreken!
b[1] = "referentie2";

trace(a); // en zijn inderdaad hetzelfde?
trace(b); // NEE! b is nu veranderd, maar a niet!

"In America, consumption equals jobs. In these days, banks aren't lending us the money we need to buy the things we don't need to create the jobs we need to pay back the loans we can't afford." - Stephen Colbert


Verwijderd

Hier zie ik de logica ff niet in... ?

  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 11:48

XangadiX

trepanatie is zóó kinderachtig

* XangadiX vraagt zich af of BB_HeavyMetal zijn antwoord inmiddels heeft... ;)

Stoer; Marduq


Verwijderd

XangadiX schreef op 13 januari 2003 @ 21:51:
* XangadiX vraagt zich af of BB_HeavyMetal zijn antwoord inmiddels heeft... ;)
Goed punt:
BB_HeavyMetal :

als je zeker wil zijn van een kopie :

Flash ActionScript:
1
2
3
4
5
6
var ln = this.map1.length;
this.currentMap = new Array();
while(ln--){
   this.currentMap[ln] = this.map1[ln];
}
delete ln;//Deze hoeft alleen als je hier geen functie van maakt.



Kopie...

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
effe een update!

zover ik kan zien is het een Referentie:

code:
1
2
3
4
5
var a = new Array("Original_0","Original_1");
var b = a;
b[0] = "New_0";
trace(a); // New_0, Original_1
trace(b); // New_0, Original_1


een

code:
1
2
3
4
5
var a = new Array("Original_0","Original_1");
var b = new Array(a);
b[1]="New_1" 
trace(a); // New_0, Original_1
trace(b); // New_0, Original_1, New_1


//eigenlijk zou ie moeten tracen [[ , ], ]... wat het ineens duidelijk maakt :)
//een new Array(a) is dus gewoon een multi-dim-array... like expected...
//dus geen copy-constructor alla C++

wat tot de obfuscatie leidde! ;):

code:
1
2
3
4
5
var a = new Array(("Original_0","Original_1"); 
var b = a;
b = ["New_0","New_1"]; //= b =new Array...
trace(a); // Original_0, Original_1
trace(b); // New_0,  New_1


maw de twee variable zijn referenced totdat een van de twee een new object wordt en dus 'unlinked' eigenlijk normaal als je met een taal werkt zonder pointers.

wat dus ook will zeggen dat je als je een copy wil pakken elk element kunt gaan kopieren :) WoeHoe AS... :)

Nou ook niet waar die is van de mailing list net :)

var a = new Array(1,2,3);
var b = a.splice(), of = a.concat(); //agh het hoeft niet moeilijk te zijn kun
//je ineens in je globals steken Array.clone = function(){return this.concat();}

[ Voor 16% gewijzigd door hobbit_be op 13-01-2003 23:12 ]


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

k heb het ook nog ff getest, en opgezocht. We zijn namelijk niet de enige die hier zijn achtergekomen. Flash zal bij een primitive ( string, number en boolean ) een copy creeren en bij een Object ( Array, Sound, function ) een reference teruggeven, alleen en alleen dan zoals hobbit_be zegt, de originele operand een new object word.

Dit zeg trouwens de specs:
The Reference Type
The internal Reference type is not a language data type. It is defined by this specification purely for
expository purposes. An implementation of ECMAScript must behave as if it produced and operated upon
references in the manner described here. However, a value of type Reference is used only as an
intermediate result of expression evaluation and cannot be stored as the value of a variable or property.
The Reference type is used to explain the behaviour of such operators as delete, typeof,andthe
assignment operators. For example, the left-hand operand of an assignment is expected to produce a
reference. The behaviour of assignment could, instead, be explained entirely in terms of a case analysis on
the syntactic form of the left-hand operand of an assignment operator, but for one difficulty: function calls
are permitted to return references. This possibility is admitted purely for the sake of host objects. No built-in
ECMAScript function defined by this specification returns a reference and there is no provision for a
user-defined function to return a reference. (Another reason not to use a syntactic case analysis is that it
would be lengthy and awkward, affecting many parts of the specification.)
lijkt me duidelijk, een reference type is dus eigenlijk gewoon een resultaat van de evaluatie van de expressie op dat moment :)

"You're only as good, as what you did last week."


Verwijderd

hobbit_be schreef op 13 januari 2003 @ 22:54:
effe een update!

var a = new Array(1,2,3);
var b = a.splice(), of = a.concat(); //agh het hoeft niet moeilijk te zijn kun
//je ineens in je globals steken Array.clone = function(){return this.concat();}
nice......

http://www.upn.mx/~max/obooks/webd/action/ch15_01.htm ... handy...

[ Voor 10% gewijzigd door Verwijderd op 14-01-2003 00:24 ]


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

lol....lopen we continue 2 boeken te verheerlijken ralph, staat het gewoon in de bijbel
:D 8)
* oh,when? gaat vanavond dat hoofdstuk nog eens goed doorlezen.

offtopic:
vaag dat dat boek online staat :?

"You're only as good, as what you did last week."


Verwijderd

oh,when? schreef op 14 januari 2003 @ 00:32:
[...]


offtopic:
vaag dat dat boek online staat :?
Kwam er ook achter...vaag ja... naja, ssshhh maar, is wel handig....

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

offtopic:
erm...wie gaat er nu om 02:00 nog reageren :p ;)

"You're only as good, as what you did last week."


Verwijderd

deze idioot....was ook pas om 11:00 op het werk hoor...flexibele werktijden he :)
Pagina: 1