Tableau de structure

Tableau de structure - C++ - Programmation

Marsh Posté le 04-02-2006 à 15:53:55    

Bonjour,
 
J'ai un probleme assez etrange (comme tous les pb d'ailleurs) avec un tableau de structure en C++.
 
Voila, j'ai une classe Model comme suit :
 
Model.h

Code :
  1. class Model{
  2. public:
  3.   Model();
  4.   ~Model(){};
  5. private
  6.   struct Case{
  7.     int numerocase;
  8.     bool couleur;
  9.   };
  10.   Case damier[100];
  11.   void initdamier();
  12. };


 
Model.cpp

Code :
  1. #include "Model.h"
  2. using namespace std;
  3. Model::Model(){
  4.   initdamier();
  5. }
  6. void Model::initdamier(){
  7.   int i;
  8.   bool _couleur = false;
  9.   for(i = 0 ; i < 100; i++){
  10.   damier[i].numerocase = i;
  11.   damier[i].couleur = _couleur;
  12.   }
  13. }


 
Avec un tel code, la compilation se déroule bien, mais j'obtient un Instruction illégale quand je lance l'execution.
 
Ce qui est etrange c'est que lorsque que je fais un tableau de 50 struct, ca marche ...

Reply

Marsh Posté le 04-02-2006 à 15:53:55   

Reply

Marsh Posté le 04-02-2006 à 16:02:14    

utilise std::vector<Case> plutôt qu'un tableau.

Reply

Marsh Posté le 04-02-2006 à 17:14:52    

J'avais effectivement pas pensé a vector. Cela dit j'ai du l'employer 1 fois dans ma vie et pas pour des structures
 
J'ai donc mis la ligne suivante :
 

Code :
  1. vector<Case> damier(100);


 
La premiere question qui me vient est de savoir si l'on peut assigner une taille.
Ensuite, j'obtient une erreur de compilation :
 
Model.h:30: error: 'vector' is used as a type, but is not defined as a type.
 
Enfin, comment assigner des valeurs ?
damier[i].numerocase = i; ??

Reply

Marsh Posté le 04-02-2006 à 17:30:36    

#include <vector>
 
et std::vector<Case> damier(100);
 
tu peux l'utiliser comme un tableau classique (accés aux éléments avec l'opérateur []) et la méthode size() retourne le nombre d'éléments.
http://www.sgi.com/tech/stl/Vector.html

Reply

Marsh Posté le 04-02-2006 à 17:41:22    

Ca avance, ca avance ^^
 
J'obtient maintenant d'autres erreurs :
Model.h:29: error: invalid data member initialization
Model.h:29: error: (use `=' to initialize static data members)

 
Pour info je remets la totalite de mon fichier d'en tête
 

Code :
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <easywindow.h>
  4. #include <vector>
  5. #ifndef Model_h
  6. #define Model_h
  7. class Model{
  8. public:
  9.   Model();
  10.   ~Model(){};
  11. private
  12.   struct Case{
  13.     int numerocase;
  14.     bool couleur;
  15.   };
  16.   std::vector<Case> damier(100);
  17.   void initdamier();
  18. };
  19. #endif


 
D'ailleurs en passant, merci pour le lien :)

Reply

Marsh Posté le 04-02-2006 à 17:48:11    

ca l'air compilable, mais il n'y a que 27 ligne, elle est ou la ligne 29 ?
 
et pourquoi tu as besoin de stdio.h ? (d'ailleur faudrais plutot inclure cstdio)


Message édité par skelter le 04-02-2006 à 17:48:41
Reply

Marsh Posté le 04-02-2006 à 17:53:23    

Effectivement c'est un peu bête de faire une copie partielle qd on a des references a des lignes ^^. J'suis pas habitué aux forums :p
 
Voila donc la source exacte

Code :
  1. /*---------------------------------------------------------------------------*/
  2. /*                                                                           */
  3. /*                                 Model.h                                   */
  4. /*                                                                           */
  5. /* Auteur: XSterna                                                           */
  6. /* Date  : 08/12/2005 11:24                                                  */
  7. /*---------------------------------------------------------------------------*/
  8. #include <stdio.h>
  9. #include <iostream>
  10. #include <easywindow.h>
  11. #include <vector>
  12. #ifndef Model_h
  13. #define Model_h
  14. class Model{
  15. public:
  16.   Model();
  17.   ~Model(){};
  18. private
  19.   struct Case{
  20.     int numerocase;
  21.     bool couleur;
  22.   };
  23.   std::vector<Case> damier(100);
  24.   void initdamier();
  25. };
  26. #endif


 
L'erreur de compilation renvoie donc à la ligne concernant le "vector<Case>"
 
Pour les libs, je fais pas trop gaffe en général a mes inclusions, j'ai pour habitude (surement mauvaise) de faire des copiés/collés à la pelle pour les debut de fichier d'en tete.


Message édité par XSterna le 04-02-2006 à 17:54:15
Reply

Marsh Posté le 04-02-2006 à 18:01:55    

le .h c'est pour déclarer, pas pour initialiser.
 
Dans ton .cpp tu fais
 
Model() : damier(100) { }

Reply

Marsh Posté le 04-02-2006 à 18:04:20    

Citation :

Pour les libs, je fais pas trop gaffe en général a mes inclusions, j'ai pour habitude (surement mauvaise) de faire des copiés/collés à la pelle pour les debut de fichier d'en tete.


 
faut faire en fonction des besoins, par exemple dans ton Model.h le seul en-tete necessaire est <vector>
 

Reply

Marsh Posté le 04-02-2006 à 18:23:06    

Citation :

le .h c'est pour déclarer, pas pour initialiser.


 
Et oui, effectivement, le probleme vient de la. Ca compile, et je n'ai plus le pb du debut avec le tableau  :bounce:  
 

Citation :

faut faire en fonction des besoins, par exemple dans ton Model.h le seul en-tete necessaire est <vector>


 
En fait le pb c'est que je ne sais jamais de quelle librairie j'ai besoin. Du coup quand il en manque je met toute celle que je connais et que j'utilise normalement et voila ce que ca donne. Mais oui dans mon exemple je n'ai pas besoin de tout. Cependant j'inclus egalement les libraires dont j'ai besoin pour le .cpp ds le fichier d'en tete. Du coup j'ai quand meme besoin de certaines parmis celle la ne serais ce que pour les cout (dont je sais pas d'ou il viennent).
 
En tout cas, merci beaucoup a tous les deux, vous m'avez été d'une precieuse aide  :jap:

Reply

Marsh Posté le 04-02-2006 à 18:23:06   

Reply

Marsh Posté le 04-02-2006 à 18:36:08    

Citation :

En fait le pb c'est que je ne sais jamais de quelle librairie j'ai besoin. Du coup quand il en manque je met toute celle que je connais et que j'utilise normalement et voila ce que ca donne.


 
Ca passe avec l'experience, enfin quand on utilise une fonction on est censé savoir dans quel en-tete elle est déclarée  :)  et en cas d'oublie le compilateur te dis quelle fonction n'est pas déclarée et tu peux rapidement retrouver son en-tete en cherchant dans sa doc
 

Citation :

Cependant j'inclus egalement les libraires dont j'ai besoin pour le .cpp ds le fichier d'en tete.


 
tu peux les inclures dans le .cpp

Reply

Marsh Posté le 05-02-2006 à 19:51:49    

Oui oui , je sais ^^  
 
Il faudrait que je trouve un document ou une page internet qui resume les principales fonctions et les librairies associées. J'ai tendance a ne pas trop me triturer la tête sur les librairies, je reserve plutot ce suplice pour le reste ^^

Reply

Sujets relatifs:

Leave a Replay

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