[STL] pb vector de structure contenant des tableaux

pb vector de structure contenant des tableaux [STL] - C++ - Programmation

Marsh Posté le 19-05-2004 à 15:47:33    

Bonjour tous le monde,
 
Voilà, j'ai voulu testé la STL et comme je suis une brèle bah j'arrive po à résoudre un truc. J'ai des vectors de structures.  
 
Enoncé
 
Les structures sont du type suivant :
 

Code :
  1. typedef struct _tVertice
  2. {
  3.     float v[3]; // { x, y, z }
  4. }tVertice;
  5. // Pareil pour des structures de coordonnée de texture et normale


Ces structure sont ensuite utilisées dans des tableaux alloués dynamiquement :

Code :
  1. tVertice   * m_ptVerticeTab;


 
Par ailleurs, j'ai des vector de structure :

Code :
  1. vector <tMaterial> m_vectorMat;


 
Avec tMaterial :

Code :
  1. typedef struct _tMaterial
  2. {
  3.     float Ka[3];
  4.     float Kd[3];
  5.     float Ks[3];
  6.     float Ns;
  7.     string map_Kd_name;
  8.     string mat_name;   
  9.    
  10.     bool hasgottexture;
  11.     bool hasgottextureAlpha;   
  12.     int id_texture;
  13.    
  14.     vector<tFace> vector_mat_face; // Vector contenant les faces appartenant au material considéré
  15. }tMaterial;
  16. // tFace
  17. typedef struct _tFace
  18. {
  19.     int vertexInd   [3];
  20.     int vertexTexInd[3];
  21.     int vertexNorInd[3];
  22.    
  23.     CVector vABC;       // Les coeffA, B et C de l'équation d'un plan
  24.                        
  25.     float D;            // Le coeffient D de l'équation du plan
  26.                  
  27. }tFace;


 
Donc ça fait 2 vectors qui trainent, vector<tFace> et vector <tMaterial>
Deux vectors contenant des tableau[3] et pis un peu n'imp" (un objet CVector).
 
Pour remplir les vector, je la joue peut être bourrin, je fais comme ça :

Code :
  1. //---pour le vector de materiaux
  2. tMaterial mat_a_ajouter;
  3. // remplir les infos de mat_a_ajouter
  4. mat_a_ajouter.Ka[0] = flottant;
  5. //... puis ajouter le ma au vector de mat
  6. m_vectorMatAlpha.push_back(mat_a_ajouter);
  7. //---pour le vector de face
  8. tFace Face_a_ajouter;
  9. Face_a_ajouter.D = flottant;
  10. // ...Remplir les infos de la structure (vABC, D et indices de toutes sortes)...
  11. // Ajouter ça au vector de materiaux à l'indice courant
  12. //(vector contenu dans une structure elle même contenue dans un vector):
  13. m_vectorMatAlpha[indiceMatCourant].vector_mat_face.push_back(Face_a_ajouter);


 
le problème
 
Le problème c'est que quand je remplit certaines choses dans les tableaux alloués dynamiquement, bah ça fait planter le tout.  
J'ai 3 tablaux alloués dynalmiquement, j'alloue les 3 de la taille que je veux et je remplit les 2 1er, ça passe lors de toute les séries de push_back() que je fais ensuite sur les vector.
Je rempli mon 3eme tableau alloué dynamiquement (avec des structures du type tVertice, c a dire juste un tab de 3 float) et là plus moyen de faire tous les push_back() d'un des deux vectors ; celui contenant des faces (et lui même contenu dans une structure tMaterial qui est elle même vouée à être contenue dans un vector.
 
Et là j'arrive pas a enchainer 2 push_back() pour le vector contenant les faces pour un material donné. A part si je fais un reserve de N, alors je pourrais rentré N faces.
 
Donc je sais pas trop d'où ça vient, si c'est du fait que les structures contiennent des tab[], et que de ce fait y'a des recopie de pointeurs et lors d'un redimensionnement du vector bah paf, ça se fait écraser et puis plantage.  
 
Donc si quelqu'un a une idée du prob (outre le fait qu'il faudrait que j'arrête de programmer), je suis tout ouïe.
 
Merci.
 
ps : chuis sous devcpp 4.9.8.9
 
 

Reply

Marsh Posté le 19-05-2004 à 15:47:33   

Reply

Marsh Posté le 19-05-2004 à 16:45:37    

oh du C !
 
entre ta notation hongroise, tes typedef C, ta notation à la con, tes identifiants, j'ai rien bité du tout ... alors t'étonnes pas de te perdre. t'as le droit à un ruban "code immaintenable"
 
y a rien de bourrin à faire des conneries ... vérifie tes allocations et sors ton debugger

Reply

Marsh Posté le 20-05-2004 à 17:38:47    

Plusieurs choses :  
 
En C++, les structures sont implicitement des types il est donc inutile d'utiliser typedef. N'utilises pas le mot clé struct, utilise plutot class et utilise la forme canonique pour les créer.
 
Il n'y a pas tout le code dans tes exemples, on ne peut pas vraiment t'aider ici. Cependant, il y a peut-être un problème du au manque de constructeur de copie dans tes classes.
 
Autre chose : La méthode vector::reserve ne fait que préallouer la mémoire. Pour effectivement utiliser cette mémoire, il faut quand même appeler la fonction push_back pour utiliser ces emplacements réservés.
 
Une dernière chose, évites les mélanges de francais et d'anglais... c'est une horreur ton code (et pas que pour ca).
 
--
Jay
{Epitech.}
http://msdn.labtech.epitech.net/blogs

Reply

Marsh Posté le 21-05-2004 à 22:31:36    

C'était bien des probs de recopie qui faisaient foirer (en plus de moi donc). J'ai tout viré pour des classes avec des noms compréhensibles et lisibles.
J'vous remercie tous les deux des conseils, c'est vrai que c'est pas bô.

Reply

Marsh Posté le 21-05-2004 à 22:37:12    

alors tu te lances dans le plug-in pour Max ?

Reply

Marsh Posté le 21-05-2004 à 22:46:37    

oué, vite fais. Je vais me pendre d'abord :D.
 
Nan plus sérieusement, je vais essayer de manger un peu plus de doc et de code de plug in, et surtout arrêter de coder comme un porc a la va vite sans trop penser et pis plus savoir d'où ça vient (le debugger de devcpp m'indiquais pas grand chose puisqu'il ne s'arrêtait pas là où ça plantait mais continuais gentillement jusqu'a arriver à l'éxécution du programme, donc j'voyais pas trop ce qui se passait vu que ça plantait plus en mode debug).
 
Et toi ton exporter se bonifie ?

Reply

Marsh Posté le 21-05-2004 à 23:11:00    

non je suis sur des pitis shaders à la con (j'essayes de faire une atmosphère à mes boules :D).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed