Problème avec un tableau de tableaux à 2 dimensions
cs_Gougoul
Messages postés6Date d'inscriptionvendredi 2 septembre 2005StatutMembreDernière intervention28 septembre 2005
-
4 sept. 2005 à 10:54
cs_Gougoul
Messages postés6Date d'inscriptionvendredi 2 septembre 2005StatutMembreDernière intervention28 septembre 2005
-
28 sept. 2005 à 10:31
Bonjour,
j'expose mon cas:
Je crée un tableau(A) qui doit recevoir comme élément un tableau(B) à deux dimensions.
à chaque itération, le tableau A reçoit bien le tableau B ( A.length()
augmente bien à chaque fois), Le dernier élément du tableau
A est bien le contenu du tableau B.
Le tableau A doit me servir de mémoire de l'évolution du tableau B et
le problème que je rencontre est que tous les éléments du tableau A
prennent le contenu du dernier élément entré.
voici le code utilisé:
1)function fA(stockage,i){
/*i est incrémenté depuis la fonction appelante et stockage prend la valeur de B*/
2) A[i]=stockage;
3)}
4)
5)if(!A){
6) A=new Array(); //
7)A[0]=B;
8)}
J'utilise FlashMX .
Si quelqu'un voit ce qui cause mon problème ou connait la cause du
problème, les suggestions et les solutions sont la bien venues.
si mon exposé n'est pas clair, n'hésitez pas à demander des éclaircissements.
merci d'avance.
A voir également:
Problème avec un tableau de tableaux à 2 dimensions
Crazyx
Messages postés128Date d'inscriptionvendredi 4 avril 2003StatutMembreDernière intervention15 octobre 2008 6 sept. 2005 à 10:37
J'ai pas bien saisi ce que tu tente de faire, surement parce que je suis débutant. Mais bon puisque personne ne répond a ce post, je me lance dans une tentative suicide :p
Tout ce que j'ai compris, c'est que tu tente de sauvegarder le contenu du TABLEAU B dans un TABLEAU A , afin de suivre la dernière modification effectué. Si c'est bien ca ce que tu souhaite faire, je crois que tu te complique la tache. Je pense, de mémoire sans être vraiment sur, que si que B est un tableau et que tu fais A = B; flash crée un tableau A exactement pareil que B. Il te suffit donc de mettre ca au début de ta fonction qui appelle la modification de B, pour avoir A qui correspond à l'etat précédent de B.
Si ce n'est pas cela que tu souhaite, expose un peu plus ton problème peut être que je pourrai t'aider.
cs_Gougoul
Messages postés6Date d'inscriptionvendredi 2 septembre 2005StatutMembreDernière intervention28 septembre 2005 7 sept. 2005 à 10:27
Bonjour crazYx,
J'ai compris d'où venait le problème(sans pouvoir le résoudre)
je vais essayer de t'expliquer un peu mieux la situation.
B est un tableau de tableaux (une matrice) qui au fur et à mesure de
l'avancement du programme va se voir modifier l'un de ses éléments.
A la fin du programme je veux pouvoir repasser en revue toute les
modifications, donc je crée un tableau A[i] qui va recevoir le tableau
B à chacune de ses modifications, l'indice i est évidement
incrémenté à chaque fois.
lorsque je fais A[i] = B , ce ne sont pas des valeurs de B qui sont
transmises à A mais des réfèrences ce qui fait que le tableau A ne
contient que des références et sera toujours égal au dernier état de
B==> donc plus aucune trace des états précédents.
ex: tu peux le tester dans flash
//DEBUT
L1=new Array("fruit","légume","etc...");
L2=new Array("rien","rien","rien");
tMatrice=new Array(L1,L2);
tRecepteur= new Array();
//tRecepteur reçoit l'état initial de tMatrice à son 1er élément
tRecepteur[0]= tMatrice; //
trace("j'affiche le contenu de tRecepteur indice 0 ==> "+tRecepteur[0]);
//je modifie le contenu de tMatrice (1ere modification)
tMatrice[0][0]="rien";
tMatrice[1][0]="fruit";
//je vérifie le changement dans tMatrice
trace("tMatrice après changement => "+tMatrice);
//et je constate les "dégats" dans tRecepteur
trace("j'affiche tRecepteur sans changement => "+tRecepteur);
//malgré le changement uniquement dans tMatrice, tRécepteur est affecté
//aussi
//tRecepteur reçoit l'état de tMatrice après changement à son 2eme élément
tRecepteur[1]=tMatrice;
//
trace("tRecepteur[0] => "+tRecepteur[0]);
trace("tRecepteur[1] => "+tRecepteur[1]);
//tRecepteur[0] = tRecepteur[1]
//FIN
Dans cet exemple tRecepteur reste toujours égal à tMatrice même si l'indice de tRecepteur change.
Le problème est là, comment faire pour modifier tMatrice sans affecter
tRecepteur ou comment transmettre par valeur et pas par référence?
Crazyx
Messages postés128Date d'inscriptionvendredi 4 avril 2003StatutMembreDernière intervention15 octobre 2008 8 sept. 2005 à 11:21
C'est pense que c'est plus clair j'ai lu en diagonale pour l'instant je lance flash je regarde et je te dis si je vois une issue a ce problème ...
A tout de suite
Crazyx
Messages postés128Date d'inscriptionvendredi 4 avril 2003StatutMembreDernière intervention15 octobre 2008 8 sept. 2005 à 13:10
J'avoue que c'es du bidouillage ce que j'ai fait , mais en fait tu créer un tableau a deux dimensions qui contient un tableau a deux dimensions et donc a partir de la ca dreraille au niveau des appels et des attributions de valeurs qui se mettent en "colonnes" au lieu de ce mettre en " ligne" donc en fait pour ton exemple la solution (bidouillage, bidouillage) que j'ai trouvé pour que ca marche c'est ca :
tRecepteur= new Array();
//tRecepteur reçoit l'état initial de tMatrice à son 1er élément
tRecepteur[0]= tMatrice[0] + "," + tMatrice[1];//
trace("j'affiche le contenu de tRecepteur indice 0 ==> "+tRecepteur[0]);
//je modifie le contenu de tMatrice (1ere modification)
tMatrice[0][0]="rien";
tMatrice[1][0]="banane";
//je vérifie le changement dans tMatrice
trace("tMatrice après changement => "+tMatrice);
//et je constate les "dégats" dans tRecepteur
trace("j'affiche tRecepteur sans changement => "+tRecepteur);
//FIN
cx
Vous n’avez pas trouvé la réponse que vous recherchez ?
Crazyx
Messages postés128Date d'inscriptionvendredi 4 avril 2003StatutMembreDernière intervention15 octobre 2008 8 sept. 2005 à 14:09
Je corrige, en fait les valeurs des tableaux se mettent en ligne et pas en colonne
donc essaie et la ca marche... si tu veux envoie moi ton code en entier je te corrige ca ...
cs_Gougoul
Messages postés6Date d'inscriptionvendredi 2 septembre 2005StatutMembreDernière intervention28 septembre 2005 28 sept. 2005 à 10:31
bonjour crazyx,
J'ai laissé le sujet un petit peu de côté, et j'y revient avec la solution.
J'ai fini par trouver la méthode qui permet de passer des arguments par
valeurs et non plus par références, ce qui causait mon problème.
la méthode à utiliser est slice().
je donne cette fois-ci un exemple avec des tableaux simples (les
tableaux à deux dimmensions compliquaient la situation), et tu
comprendra où était mon problème.
//DEBUT
t_tableau = new Array(1,2,3);
trace(t_tableau);
t_tableau_bis = t_tableau;
trace("=====================");
trace("t_tableau = "+t_tableau);
trace("t_tableau_bis = "+t_tableau_bis);
trace("=====================");
trace("En modifiant un élément de t_tableau, t_tableau_bis");
trace("est modifié aussi");
trace("t_tableau[1] = 5;");
t_tableau[1] = 5;
trace("t_tableau = "+t_tableau);
trace("t_tableau_bis = "+t_tableau_bis); // le problème se situe là
trace("=====================");
trace("grâce à slice(), je peux faire passer les valeurs ");
trace("d'un tableau sans utiliser les références");
t_tableau_ter = t_tableau.slice(0);
trace("je modifie un élément de t_tableau et t_tableau_ter");
trace("n'est plus modifié");
trace("t_tableau[1] = 10;");
t_tableau[1] = 10;
trace("t_tableau = "+t_tableau);
trace("t_tableau_ter = "+t_tableau_ter); //le problème est résolu