IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

STL Problème avec une liste d'instances de class


Sujet :

SL & STL C++

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut STL Problème avec une liste d'instances de class
    Bonjour,
    Donc voila, au départ j'utilisai une instance de class unique ( pas de liste ), et tout marchait bien. Ayant besoin d'un certain nombre de ces instances, je décide donc de les regrouper dans une "list" de la std. Mais voila, après beaucoup de tentatives et de bidouilles, rien a faire, cela ne fonctionne pas correctement et je ne comprend pas pourquoi. Actuellement pas d'erreur à la compilation, mais lorsque le programme s'exécute, l'instance qui devrait afficher une image à l'écran n'affiche rien, mais ne génére pas d'erreur lors de l'exécution du prog.

    Voici un regroupement des lignes interressantes STL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    list <Cbowl> Lbowl;
    list <Cbowl>::iterator Ibowl;
     
    Cbowl A_bowl;
    Lbowl.push_back(A_bowl);
    Lbowl.begin()->initpos(0,430,1);
    Lbowl.begin()->draw();
    Apparament, ça vient du fait que données de la class ne se modifient pas, mais je suis pas à l'aise avec les pointeurs.

  2. #2
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Salut, as tu des pointeurs membre de ta classe Cbowl qui pointent sur des objets créé dynamiquement ? Si tu en as il faut absolument que tu définisse un constructeur de recopie qui copie correctement ces membres dynamiques !!

    L'erreur que tu peux avoir serait sur le push_back.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Lbowl.push_back(A_bowl);
    en fait, l'objet inséré dans ta liste n'est pas l'objet A_bowl, mais une copie de celui-ci. Cette copie doit donc être correcte !

    Tu vois ou je veux en venir ? Sinon fais voir le code de Cbowl.

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par BruceBoc
    Bonjour,
    Donc voila, au départ j'utilisai une instance de class unique ( pas de liste ), et tout marchait bien. Ayant besoin d'un certain nombre de ces instances, je décide donc de les regrouper dans une "list" de la std. Mais voila, après beaucoup de tentatives et de bidouilles, rien a faire, cela ne fonctionne pas correctement et je ne comprend pas pourquoi. Actuellement pas d'erreur à la compilation, mais lorsque le programme s'exécute, l'instance qui devrait afficher une image à l'écran n'affiche rien, mais ne génére pas d'erreur lors de l'exécution du prog.

    Voici un regroupement des lignes interressantes STL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    list <Cbowl> Lbowl;
    list <Cbowl>::iterator Ibowl;
     
    Cbowl A_bowl;
    Lbowl.push_back(A_bowl);
    Lbowl.begin()->initpos(0,430,1);
    Lbowl.begin()->draw();
    Apparament, ça vient du fait que données de la class ne se modifient pas, mais je suis pas à l'aise avec les pointeurs.
    Et en faisant
    Lbowl.at(0)->initpos (0,430,1)
    Lbowl.at(0)->draw()
    ?

    EDIT : après reflexion, ce ne sont pas des pointeurs que tu mets dans ta liste, donc c'est
    Lbowl.at(0).initpos (0, 430, 1)
    Lbowl.at(0).draw ();;

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et en faisant Lbowl.at(0)->initpos (0,430,1) ?
    Attention à ne pas confondre avec std::vector. Si on pouvait accéder aux éléments d'une liste via des indices, ça ne servirait à rien
    Par contre on peut utiliser Lbowl.front().initpos(...).

    Je pencherai aussi pour une mauvaise gestion de la copie au niveau de la classe stockée.

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Laurent Gomila
    Attention à ne pas confondre avec std::vector. Si on pouvait accéder aux éléments d'une liste via des indices, ça ne servirait à rien
    Par contre on peut utiliser Lbowl.front().initpos(...).

    Je pencherai aussi pour une mauvaise gestion de la copie au niveau de la classe stockée.
    Ah je pensais que ça fonctionnait pareil... Mais je comprends pas, dans sa liste il ne met pas de pointeur, pouruquoi il utilise :

    Lbowl.begin()->initpos(0,430,1);
    Lbowl.begin()->draw();

    begin() renvoi un pointeur vers le premier élément ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    begin() renvoi un pointeur vers le premier élément ?
    Un itérateur, qui se comporte comme un pointeur.
    Boost ftw

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par loufoque
    Un itérateur, qui se comporte comme un pointeur.
    Et pourquoi il n'utilise pas son iterateur (Ibowl) pour ça ?

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    J'ai changé le "->" par "." et sa ne change rien.
    Voici le code de la class :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    class Cbowl
    {
     
    	private:
     
    		GLuint surface;
     
    		SDL_Rect rectsrc;
    		SDL_Rect rectdest;
     
    		int size_X;
    		int size_Y;
    		int frames_X;
    		int frames_Y;
    		int way;
    		int pos_X;
    		int pos_Y;
    		int amplitude;
    		float step;
    		float angle;
     
    	public:
     
    		FSOUND_SAMPLE* hit;
     
    		void load(char* filename, int sizeX, int sizeY, int framesX, int framesY);
    		void draw();
    		void initpos();
    		void update();
    		void changeway();
     
    		int returnposX(){ return pos_X;};
    		int returnposY(){ return pos_Y;};
    		int returnsizeX(){ return rectsrc.w;};
    		int returnWay(){ return way;};
     
    };
    Je ne me sert pas encore de l'itérateur, car déja à la base le code ne marche déja pas, et pas besoin de cela puisque la liste ne comporte pour l'instant qu'un seul élément.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    Pourquoi stocker des objets et plutot des références ou des pointeurs ?
    Ca éviterait les copies couteuses ...

    La fonction initpos de la classe ne prend pas d'arguments.
    Il n'y a pas de constructeur de recopie.
    Que sont les GLuint, et SDL_rect ?

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Pourquoi stocker des objets et plutot des références ou des pointeurs ?
    Je veux bien passer des références ou des pointeurs, mais j'ai déja essayé et je n'arrive pas à compiler, il faudrait que tu me montre le code pour je l'essaye ( je ne suis pas à l'aise avec ces 2 notions ).

    La fonction initpos de la classe ne prend pas d'arguments.
    En fait si, simple erreur de recopiage.

    Il n'y a pas de constructeur de recopie.
    Je ne sai pas à quoi sa sert, peut-tu préciser l'intérêt.

    Que sont les GLuint, et SDL_rect ?
    GLuint : variable OpenGL pour stocker une texture
    SDL_rect : variable SDL qui est un tableau de positions ( x, y ,h, w ).

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    En fait si, simple erreur de recopiage.
    Comment tu veux qu'on t'aide si tu fais des erreurs de recopiage ?
    Fournis un exemple minimal réduit qu'on peut compiler et qui produit ton problème.
    Boost ftw

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    Citation Envoyé par BruceBoc
    Je veux bien passer des références ou des pointeurs, mais j'ai déja essayé et je n'arrive pas à compiler, il faudrait que tu me montre le code pour je l'essaye ( je ne suis pas à l'aise avec ces 2 notions ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list <Cbowl*> Lbowl;
    LBowl.push_back(new CBowl());
    Il serait bien aussi qu'il y ait un constructeur ...

    Je ne sai pas à quoi sa sert, peut-tu préciser l'intérêt.
    Ben vu que tu veux stocker des objets, il faut un constructeur de copie puisque tu passes des objets par valeur.
    Le compilo t'en génères un par défaut, qui peut trés bien aller si ton objet n'utilises que des données "simples" (pas d'allocation, objets ayant déjà un constructeur de copie ...).
    Si tu les passes par réf ou pointeur, il n'y aura pas besoin de faire de copie.
    [/QUOTE]

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Merci beaucoup Olive le malin, maintenant sa fonctionne à merveille.
    Voici donc le bon code à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    list <Cbowl*> Lbowl;
    Lbowl.push_back(new CBowl());
    Lbowl.front()->initpos(0,430,1);
    ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD10]Problème avec une liste
    Par Louis Griffont dans le forum WinDev
    Réponses: 11
    Dernier message: 25/05/2007, 08h40
  2. STL : Bug avec une list
    Par Winder dans le forum SL & STL
    Réponses: 1
    Dernier message: 10/05/2007, 04h03
  3. Problème avec une liste chainée
    Par 0v3rb1t dans le forum C
    Réponses: 3
    Dernier message: 08/05/2007, 19h27
  4. Problème avec une liste.
    Par Baban29 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 26/04/2007, 12h12
  5. [Débutant] problème avec une liste déroulante
    Par stan21 dans le forum Access
    Réponses: 3
    Dernier message: 12/07/2006, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo