Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
609 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Tableau dynamique 2D

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tableau dynamique 2D

n°1872425
spinzero
Posté le 13-04-2009 à 09:35:07  profilanswer
 

Bonjour  :)  
 
J'essaie de manipuler un tableau 2D dont la 2ème colonne serait de taille variable. Autrement dit, la première colonne regrouperait les identifiants de mollécules tandis que la seconde, ceux de particules associées; le nombre de particules étant différent selon chaque mollécules...  
 
Dans le code ci-dessous, j'essaie d'associer l'identifiant d'une mollécule à un couple de particules, en fonctions des informations qu'elles contiennent ou non. Si aucune d'entre elles n'en possède on en crée un nouveau, sinon lorsqu'au moins l'une d'entre elle appartient déjà à une mollécule, l'autre prend alors le même identifiant molécullaire. En revanche, si chaque particule à un identifiant distinct, alors l'une d'entre elle prend le même identifiant molléculaire que l'autre mais doit supprimer sa référence associé à la mollécule antérieure:
 

Code :
  1. static vector< vector<int> > molles_A;//(1, vector<int>(NMAX));
  2. int molle_i=0;
  3. ...
  4. //------------------------------------------------------------------------------------------------
  5. void setMolleID( NxActor *A, NxActor *B )
  6. {
  7. ONE_o* oA = (ONE_o*)A->userData;
  8. int molIdA = oA->id_mol;
  9. ONE_o* oB = (ONE_o*)B->userData;
  10. int molIdB = oB->id_mol;
  11. if(  molIdA == NULL &&  molIdB == NULL ) //------ NOT YET
  12. {
  13.  updateMolles_A( 1, NULL, NULL, A, B );
  14.  ONE_o* oA = (ONE_o*)A->userData;
  15.       oA->id_mol = mol_i;
  16.  ONE_o* oB = (ONE_o*)B->userData;
  17.       oB->id_mol = mol_i;
  18.                mol_i ++;
  19. }
  20. else if(  molIdA != NULL &&  molIdB == NULL )//---- A
  21. {
  22.  updateMolles_A( 2, molIdA, NULL, NULL, B );
  23.   ONE_o* oB = (ONE_o*)B->userData;
  24.      oB->id_mol = molIdA;
  25. }
  26. else if(  molIdA == NULL &&  molIdB != NULL ) //---- B
  27. {  cerr << "{PhysicCORE::setMolleID} C)  molIdB != NULL " << endl;
  28.  updateMolles_A( 3, NULL, molIdB, A, NULL );
  29.  ONE_o* oA = (ONE_o*)A->userData;
  30.       oA->id_mol = molIdB;
  31. }
  32. else if(  molIdA != NULL &&  molIdB != NULL ) //---- A & B
  33. {
  34.  NxArray<NxJoint *> jtsA = getJOINTS_L( A );
  35.  NxArray<NxJoint *> jtsB = getJOINTS_L( B );
  36.  int A_T = jtsA.size();
  37.  int B_T = jtsB.size();
  38.  if( A_T > B_T )
  39.  {
  40.   updateMolles_A( 4, molIdA, molIdB, A, B );
  41.   ONE_o* oB = (ONE_o*)B->userData;
  42.        oB->id_mol = molIdA;
  43.  }
  44.  else if( A_T < B_T)
  45.  { 
  46.   updateMolles_A( 5, molIdA, molIdB, A, B );
  47.   ONE_o* oA = (ONE_o*)A->userData;
  48.          oA->id_mol = molIdB;
  49.  }
  50.  else //--- Devrait être arbitraire
  51.  { 
  52.   updateMolles_A( 6, molIdA, molIdB, A, B );
  53.   ONE_o* oA = (ONE_o*)A->userData;
  54.          oA->id_mol = molIdB;
  55.  }
  56. }
  57. }
  58. //----------------------------------------------------------------------------------------------
  59. void updateMolles_A( int md, int molIdA, int molIdB, NxActor *A=NULL, NxActor *B=NULL )
  60. {
  61. int t1 = molles_A.size();
  62. int t2;
  63. int i; int j; boolpClean;
  64. vector<int>act_A;
  65. ONE_o* oA= NULL;
  66. ONE_o* oB= NULL;
  67. int idA= NULL ;
  68. int idB= NULL;
  69. if (  A!=NULL )
  70.    {
  71.  oA = (ONE_o*)A->userData;
  72.  idA = oA->id;
  73. }
  74. if (  B!=NULL)
  75. {
  76.  oB = (ONE_o*)B->userData;
  77.  idB = oB->id;
  78. }
  79. if ( md == 1 )
  80. {
  81.  if ( oA && oB)
  82.   act_A.push_back( idA );
  83.  act_A.push_back( idB ); );
  84.  molles_A.push_back( act_A );
  85. }
  86. else if ( md == 2 )
  87. {
  88.  if (  oB != NULL )
  89.  act_A = molles_A[ molIdA ];
  90.  act_A.push_back( idB );
  91. }
  92. else if ( md == 3 )
  93. {
  94.  if (  oA!= NULL )
  95.  act_A = molles_A[ molIdB ];
  96.  act_A.push_back( idA );
  97. }
  98. else if ( md == 4 )
  99. {
  100.  if (  oA!= NULL && oB!= NULL )
  101.  act_A = molles_A[ molIdA ];
  102.  act_A.push_back( idB );
  103.  pClean = cleanMolles_A( idB, molIdB );
  104. }
  105. molle_i++;
  106. }
  107. //------------------------------------------------------------------------------------------------
  108. bool cleanMolles_A( int id, int molId )
  109. {
  110. bool pClean =false;
  111. vector<int>act_A = molles_A[molId];
  112. int t1 = act_A.size();
  113. if ( t1 != 0 )
  114. {
  115.  for( int i=0;i<t1;i++)
  116.  {
  117.   if( act_A[i] == id )
  118.   {
  119.    act_A.erase( act_A.begin() + i );
  120.     pClean = true;
  121.     break;
  122.   }
  123.  }
  124. }
  125. return pClean;
  126. }


Le problème c'est qu'au lieu d'ajouter (push_back) de nouveaux id de particules dans la seconde colonne du tableau, qui se limite alors à 2 éléments max, il me les ajoute dans une nouvelle mollécule :sweat:  
 
Auriez-vous une petite idée sur la correction à faire ?
merzi


Message édité par spinzero le 13-04-2009 à 09:55:05
mood
Publicité
Posté le 13-04-2009 à 09:35:07  profilanswer
 

n°1872431
Joel F
Real men use unique_ptr
Posté le 13-04-2009 à 10:08:16  profilanswer
 

boost::multi_array :o
et dobulon avec ton autre post

n°1872451
spinzero
Posté le 13-04-2009 à 12:08:12  profilanswer
 

Joel F a écrit :

boost::multi_array :o
et dobulon avec ton autre post


 
Oui, ce serait mieux  :)  
J'avais essayé d'utiliser multi_array mais l'ajout avec[n][n] et la supression -dont je n'ai pas vu d'exemple- d'élément d'une dimension ne me paraissait pas évident :pt1cable:  
On va rvoir ça alors...


Message édité par spinzero le 13-04-2009 à 12:12:08

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Tableau dynamique 2D

 

Sujets relatifs
Tableau dynamique BOOSTCreation de tableau
[C] Initialisation d'un tableau constantProblème avec allocation dynamique de tableau (C)
tri de plusieurs tableauCréer un tableau de correspondance
Explication d un tableau sérialisé 
Plus de sujets relatifs à : Tableau dynamique 2D


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR