Forums Développement Multimédia

Aller au contenu

- - - - -

Copier un array et le modifier sans affecter la source

CODE AS3

15 réponses à ce sujet

#1 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 03 August 2014 - 20:23 PM

Bonjour,

J'ai un array source que je nomme matrices et un cible matrice que je veux modifier sans affecter la source
j'ai fait ceci mais malheureusement j'ai les 2 matrice et matrices qui se trouvent pareil après modification
Ou se trouve mon erreur ?

Merci pour votre aide


var matrices:Array = new Array();
var level1:Array = [
          [1,1,"S",2,1,2,2,1,1,1],
          [1,1,2,2,1,2,1,1,1,1],
          [1,2,1,2,1,2,2,1,1,1],
          [1,2,1,2,1,2,1,2,1,1],
          [1,2,1,2,1,1,1,2,1,1],
          [1,2,1,2,1,2,1,1,1,2],
          [1,2,1,2,1,2,1,1,1,2],
          [1,1,1,1,1,1,2,1,1,2],
          [1,1,2,2,1,2,1,1,1,2],
          [1,1,1,2,1,1,1,1,1,2],
         ];
matrices.push(level1);
var matrice:Array;
matrice=[];
matrice = matrices.concat();
matrice[0][0][0]=5;
trace(matrice);
trace(matrices);
 


#2 elle-ere

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 354 messages

Posté 04 August 2014 - 07:36 AM

Bonjour à tous !
Cela vient de l'affectation du tableau level1 qui contient des références à des objets, avec concat, toutes les modifications sur les objets sont répercutées.

Dans quel but précis utiliser push ?

#3 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 04 August 2014 - 09:48 AM

Bonjour et merci pour ta réponse elle-ere,

c'est pour obtenir un tableau à 3 dimensions pour faire un beau jeu ;)

Le tableau est composé de Niveau / Lignes / Colonnes

#4 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 328 messages

Posté 04 August 2014 - 10:15 AM

Disons que la méthode concat de ton array crée une copie supercifielle de celui-ci ce qui veut dire que le contenu à l'intérieur n'est pas dupliqué, comme l'a si justement précisé elle-ere le contenu est un tableau qui est un objet complexe.

Par définition donc, le tableau en question sera le même que celui qui est poussé dans le tableau d'origine via ton push.

#5 elle-ere

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 354 messages

Posté 04 August 2014 - 10:40 AM

Je ne connaissais pas cette pratique !

1,1,S,2,1,2,2,1,1,1*1,1,2,2,1,2,1,1,1,1*1,2,1,2,1,2,2,1,1,1*1,2,1,2,1,2,1,2,1,1*1,2,1,2,1,1,1,2,1,1*1,2,1,2,1,2,1,1,1,2*1,2,1,2,1,2,1,1,1,2*1,1,1,1,1,1,2,1,1,2*1,1,tt,2,1,2,1,1,1,2*1,1,1,2,1,1,1,1,1,2

1,1,S,2,1,2,2,1,1,1,1,1,2,2,1,2,1,1,1,1,1,2,1,2,1,2,2,1,1,1,1,2,1,2,1,2,1,2,1,1,1,2,1,2,1,1,1,2,1,1,1,2,1,2,1,2,1,1,1,2,1,2,1,2,1,2,1,1,1,2,1,1,1,1,1,1,2,1,1,2,1,1,tt,2,1,2,1,1,1,2,1,1,1,2,1,1,1,1,1,2



Après push,
La lettre S est en matrice[0][0][2] au lieu de level1[0][2]

la chaîne tt est en matrice[0][8][2] au lieu de level1[8][2]

Ok

#6 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 05 August 2014 - 00:33 AM

Bref vous me donner pas de solution ;)

#7 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1682 messages

Posté 05 August 2014 - 02:50 AM

moi j'utiliserais plutôt

var matrices:Array = new Array();
var level1:Array = [
    [1,1,"S",2,1,2,2,1,1,1],
    [1,1,2,2,1,2,1,1,1,1],
    [1,2,1,2,1,2,2,1,1,1],
    [1,2,1,2,1,2,1,2,1,1],
    [1,2,1,2,1,1,1,2,1,1],
    [1,2,1,2,1,2,1,1,1,2],
    [1,2,1,2,1,2,1,1,1,2],
    [1,1,1,1,1,1,2,1,1,2],
    [1,1,2,2,1,2,1,1,1,2],
    [1,1,1,2,1,1,1,1,1,2],
   ];
matrices.push(level1);
var matrice:Array;
matrice=[];
var copier:ByteArray = new ByteArray();
copier.writeObject(matrices);
copier.position = 0;
matrice = copier.readObject();
matrice[0][0][0]=5;
trace(matrice);
trace(matrices);
 


#8 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 328 messages

Posté 05 August 2014 - 10:10 AM

On t'a donné la cause du problème, la solution est facile à déduire. Il faut que tu réalises une copie non superficielle de ton tableau "level1" et pas seulement du tableau qui contient le tableau level1. Après, l'implémentation de cette solution est à ta charge ;)

#9 elle-ere

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 354 messages

Posté 05 August 2014 - 11:40 AM

Je me permet d'ajouter que la modification est également répercutée sur le tableau lebel1...
Souhaitable ou non ?
Je ne connaît pas AS3 mais JavaScript qui s'apparente.
Mika2, pour no problèmes
Il faut créer les tableaux matrice(s) avec le constructeur Array et ensuite par une affectation copier chaque élément de level1 dans ses tableaux.
Tout sera indépendant.

elle-ere (LR)

#10 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 05 August 2014 - 13:38 PM

J'ai trouvé la solution ;) et ça fonctionne nickel

#11 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 328 messages

Posté 05 August 2014 - 13:39 PM

Tu peux la faire partager alors ! Pour les autres qui auront le même problème que toi.

#12 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 05 August 2014 - 14:17 PM

tu dis bien on t'a donné la réponse non ? alors tu peux toi aussi la fournir pourquoi moi ? ;)
allez bonne journée

#13 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 328 messages

Posté 05 August 2014 - 15:37 PM

Disons qu'ici c'est un lieu de partage et d'entraide, si tu as trouvé une solution il est de bon ton de faire partager aux autres le fruit de tes recherches, de plus nous t'avons pas mal aidé à trouver la solution.

Le côté "communautaire" c'est pas que dans un sens que ça fonctionne, certes je n'ai pas voulu te fournir une implémentation toute prête, c'est pour ton bien car on apprend mieux en codant soi-même. Nous avons cependant pris du temps pour orienter tes recherches et ton code, ce qui t'as fait gagner du temps. Quand des gens prennent la peine de t'accorder de leur temps il est normal de leur renvoyer l'ascenseur ou même de penser aux petits copains qui viendront plus tard chercher la solution au même problème que toi.

Après je ne vais pas débattre 1000 ans avec toi sur le côté communautaire, nous savons pertinemment toi et moi que nous n'avons pas la même vision du monde suite aux multiples échanges que nous avons eu, mais même sans cela, remercier les personnes qui t'ont accordé du temps ( comme elle-erre ) c'est au delà de la communauté, c'est de la politesse.

#14 Mika2

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 142 messages

Posté 05 August 2014 - 15:59 PM

var matrices:Array = new Array();
var level1:Array = [
[1,1,"S",2,1,2,2,1,1,1],
[1,1,2,2,1,2,1,1,1,1],
[1,2,1,2,1,2,2,1,1,1],
[1,2,1,2,1,2,1,2,1,1],
[1,2,1,2,1,1,1,2,1,1],
[1,2,1,2,1,2,1,1,1,2],
[1,2,1,2,1,2,1,1,1,2],
[1,1,1,1,1,1,2,1,1,2],
[1,1,2,2,1,2,1,1,1,2],
[1,1,1,2,1,1,1,1,1,2],
];
matrices.push(level1);
var matrice:Array;
matrice=[];
var copier:ByteArray = new ByteArray();
copier.writeObject(matrices);
copier.position = 0;
matrice = copier.readObject();
matrice[0][0][0]=5;
trace(matrice);
trace(matrices);

Mais j'ai trouve avant la solution pol2095
Encore une fois je trouve que si ce forum perd de sa valeur et de plus en plus est qu'on demande

a la personne de reflechir ensuite on lui demande de donner la solution et pourquoi ?
Pourquoi ne pas demander aussi aux autres personnes de rèflechir aussi ?
Il est là le problème de ce forum on tourne en rond......


Je demande pas de fournir une tonne d'instruction mais juste 4 lignes
Je vais être sympa avec les utilisateurs de GOOGLE

Voici un module qui permettra de copier un array



function clone(source:Object):*
{
                         var myBA:ByteArray = new ByteArray();
                         myBA.writeObject(source);
                         myBA.position = 0;
                         return(myBA.readObject());
}
 


Vous avez en retour la table copiée ;) du style matrice = clone(matrices);
matrices étant la source
matrice lui la table dupliquée


MERCI Pol2095 et elle-ere

#15 thot

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPip
  • 328 messages

Posté 05 August 2014 - 16:25 PM

On te demande de réfléchir Mika2 mais tu as remarqué que nous avons pris la peine de t'aider, nous ne t'avons pas laissé seul. Il est donc normal que tu prennes le temps de partager le fruit de ton travail.

#16 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 06 August 2014 - 14:15 PM

Citation

Encore une fois je trouve que si ce forum perd de sa valeur et de plus en plus est qu'on demande

a la personne de reflechir ensuite on lui demande de donner la solution et pourquoi ?
Pourquoi ne pas demander aussi aux autres personnes de rèflechir aussi ?
Il est là le problème de ce forum on tourne en rond......


Je demande pas de fournir une tonne d'instruction mais juste 4 lignes
Je vais être sympa avec les utilisateurs de GOOGLE

On a toujours demandé aux personnes qui posent les questions de réfléchir par eux même, ce n'est pas aider quelqu'un de lui donner directement la réponse. Il existe un proverbe pour ça : "donne un poisson à un homme et tu le nourrira pour la journée, aprend lui à pêcher et tu lui permettra de se nourrir toute sa vie". Ce forum n'a jamais été un supermarché, mais une zone d'entraide et d'apprentissage, si tu sais faire la différence entre un supermarché et une école, tu as tout bon. Si on demande aux gens de venir donner la solution qu'ils ont trouvé c'est aussi pour que des gens comme toi, qui cherchent une réponse, puissent la trouver en faisant des recherches, ce que tu devrais normalement avoir fait si tu en arrive à venir poser cette question. Donner la réponse en fin de réflexion permet aussi de suivre le chemin qui a mené à cette solution, or plutôt que de nous dire comment tu réfléchis à la chose, tu te contente de dire qu'on ne te donne pas la solution.

Une fois de plus la réponse se trouve dans la doc, il s'agit d'une copie d'objet de haut niveau, Array est de haut niveau, il s'agit d'objets complexes qui ne sont pas "copiés" comme les objets de bas niveau (int, Number, String, ...), mais une occurence avec laquelle on fait une liaison. Le tableau original et sa copie sont tout simplement liés, tu modifie l'un et ça modifie l'autre. Si tu veux éviter ça tu doit faire une copie manuellement de chaque élément de ton tableau, pour cela tu peux utiliser "concat" qui concatène (copie index par index) un tableau B dans un tableau A, ou passer par les ByteArrays comme le propose pol2095.

Donc, un tableau à plusieurs entrées, comprenant lui même des tableaux, ne peut être copié si facilement, il faut copier également le contenu de chaque tableau contenu dans ton super tableau, avec les mêmes méthodes.

Pour t'aider à aller plus loin, une liste suffit amplement au lieu d'un tableau à deux dimensions pour créer ton level, il suffit d'utiliser la formule suivante pour passer de l'un à l'autre :

Colonne = index % nombre de colonnes
Ligne = int(index / nombre de colonnes)

Par exemple avec un level de 3*3 :

liste = [1,2,3,4,5,6,7,8,9];
nbCol = 3;

index = 4;
colonne = index % nbCol; // 4%3 = 0
ligne = int(index / nbCol); // int(4/3) = 1

L'index 4 correspond donc à la case de la deuxième ligne et première colonne de la grille.

Il est plus rapide de faire des opérations sur une liste que sur un tableau à multiples dimensions, y compris de la copier...




Répondre à ce sujet



  

1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP