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 :

probleme avec vector


Sujet :

SL & STL C++

  1. #1
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut probleme avec vector
    Bonjour,


    j ai un probleme avec la classe vector de la STL,

    je suis en train de developper une Gui en opengl et j utilise la classe vector ,

    tout fonctionne plus ou moins bien mais il y a vraiment une chose qui me semble tres etrange et je pense qu' il y a quelque chose qui doit m echapper quelque part :

    dans ma gui , j ajoute un certain nombre de controles sliders à un menu comme ceci :

    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
     
    class DLLFUNC VGL_Menu {
     
    public:
     
                   	int MouseX,MouseY;
     
    public:
     
    	VGL_Menu();
    	VGL_Menu(int WindowX,int WindowY);
    	VGL_Menu(Vector2 WindowSize);
    	~VGL_Menu();
                   //: ***** encore du code /////
    	vector <VGL_GUISlider>       Sliders;
    	void Add_Slider(VGL_GUISlider Slider_);
       //: ***** encore du code /////
     
     
    };
     
     
    // methode Add_Slider :
     
    void DLLFUNC VGL_Menu::Add_Slider(VGL_GUISlider Slider_) {
    Slider_.pmouseX = &(this->MouseX);
    Slider_.pmouseY = &(this->MouseY);
    Sliders.push_back(Slider_);
     
    }
    si j utilise la methode add slider j ai le droit a user breakpoint à la fin de l execution de mon programme il y a un probleme apparement au niveau de la desallocation de memoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HEAP[vbasecode.exe]: Invalid Address specified to RtlFreeHeap( 02AA0000, 029A5330 )

    par contre si je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    // j ai une instance de classe VGL_Menu nommée mMenu 
     
    mySlider.pmouseX = &(mMenu.MouseX);
    mySlider.pmouseY = &(mMenu.MouseY);	
    mMenu.Sliders.push_back(mySlider);
    soit le meme code que dans la methode Add_Slider mais a l exterieur de la classe VGL_Menu , la pas de probleme ...

    Donc si qqun à une idée d ou peut venir le probleme, je me doute bien que j ai du faire une connerie mais ou ??

    Merci d avance

    salut

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Chaque fois que j'ai eu ce genre de pbm c'est que je n'avais pas de constructeur par recopie de ma classe que je mettais dans mon vector (VGL_GUISlider).
    Tu en as un?

  3. #3
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par traiangueul
    Chaque fois que j'ai eu ce genre de pbm c'est que je n'avais pas de constructeur par recopie de ma classe que je mettais dans mon vector (VGL_GUISlider).
    Tu en as un?
    Salut,

    a non je n en ai pas. je vais en creer un et je te tiens au courant

    a+

  4. #4
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    re ,

    alors j ai crée des constructeurs par recopie dans toutes les classes et structures que je mets dans des vector dans ma classe VGL_Menu.

    mais c est toujours pareil , le plus etrange c est que :

    en mode debug si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    mMenu.Add_Item(i);
     
    ///: rappel de la fonction VGL_Menu::Add_Item///
    void DLLFUNC VGL_Menu::Add_Item(MenuItem &Item) {
    Items.push_back(Item);
    }
    ca marche pas de probleme .

    en mode realese ca marche plus par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mMenu.Items.push_back(i);
    marche !


    ????

  5. #5
    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 : 40
    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
    L'insertion dans un conteneur fait une copie, cela n'insère pas l'élément original. Il faut donc bien un constructeur par copie, mais également un destructeur et un opérateur d'affectation corrects.
    Mais si ta classe ne possède aucun pointeur / référence / truc non copiable trivialement, tu n'en as pas besoin, ceux générés par le compilo seront suffisant.

    Est-ce qu'on peut voir les définitions des classes stockées ?

  6. #6
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par Loulou24
    L'insertion dans un conteneur fait une copie, cela n'insère pas l'élément original. Il faut donc bien un constructeur par copie, mais également un destructeur et un opérateur d'affectation corrects.
    Mais si ta classe ne possède aucun pointeur / référence / truc non copiable trivialement, tu n'en as pas besoin, ceux générés par le compilo seront suffisant.

    Est-ce qu'on peut voir les définitions des classes stockées ?

  7. #7
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par Loulou24
    L'insertion dans un conteneur fait une copie, cela n'insère pas l'élément original. Il faut donc bien un constructeur par copie, mais également un destructeur et un opérateur d'affectation corrects.
    Mais si ta classe ne possède aucun pointeur / référence / truc non copiable trivialement, tu n'en as pas besoin, ceux générés par le compilo seront suffisant.

    Est-ce qu'on peut voir les définitions des classes stockées ?
    wao , je me demande comment mon code a pu marcher tout ce temps alors lol , ca fait quelques temps que j utilise vector et je ne me suis jamais occupé de constructeurs par recopie ...

    bon je mets qu' un partie des definitions sinon je prends par mal de place .

    je prends juste le cas du MenuItem , un bouton avec un rollover qui a lui aussi ce probleme :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    struct MenuItem {
     
    	MenuItem() {
     
    		v1 = Vector2();
    		v2 = Vector2();
    		tex1=tex2=0;
    		bal=0;
    	};
    	MenuItem(const MenuItem &I) {
    		v1 = I.v1;
    		v2 = I.v2;
    		tex1=I.tex1;
    		tex2=I.tex2;
    		bal=I.bal;
    	};
     
     
    	Vector2 v1;
    	Vector2 v2;
    	int tex1;
    	int tex2;
    	float bal; // balance 
     
    };
     
     
    class DLLFUNC VGL_Menu {
     
    public:
     
    	int WndX,WndY;
    	int MouseX,MouseY;
    	bool LeftButton;
     
    	VGL_Menu();
    	VGL_Menu(int WindowX,int WindowY);
    	VGL_Menu(Vector2 WindowSize);
     
    	vector <MenuItem> Items;
    	void Add_Item(MenuItem &Item);
     
                    //// ............encore des fonctions..///
     
    	int ItemOver;
    	void Draw();
    	int  Bind();
    	void SetCursorSprite(const Sprite &CursorSprite);
    	Sprite Cursor_Sprite;
    	void SetBackGroundSprite(const Sprite &BackGroundSprite);
    	Sprite BackGround_Sprite;
     
    	bool LastMouse;
    	bool FadeEffect;
    	void DestroyMenu();
     
    private:
    	bool bHasCursorSprite;
                    bool bHasBackGroundSprite;
     
    };

  8. #8
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    .....................................
    ....................................

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    pour ton pbm debug/release.
    Tu es sur d'avoir absoluement les memes options pour ton projet?
    ta macro DLLFUNC est bien définie également?

  10. #10
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par traiangueul
    pour ton pbm debug/release.
    Tu es sur d'avoir absoluement les memes options pour ton projet?
    ta macro DLLFUNC est bien définie également?

    pour les options elles sont les meme en debug et realese ,

    pour DLLFUNC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define DLLFUNC  __declspec(dllimport)
    les fonctions sont definies dans une dll

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define DLLFUNC  __declspec(dllimport)

    Quel dommage de gacher la portabilité de GUI et de OpenGL avec cette macro...

  12. #12
    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 : 40
    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
    Tu n'as pas besoin de constructeur par copie / destructeur / opérateur d'affectation pour ta classe MenuItem, tous ses membres sont bien copiables et détruits automatiquement. Le problème ne vient pas de là.

    Que dit le debugger et la pile d'appels de fonctions ?

    Et attention avec les bibliothèques dynamiques : tout ce qui est alloué d'un coté (exe ou dll) doit être désalloué du même coté, sinon ça peut donner le genre d'erreur que tu as.

  13. #13
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par Loulou24
    Tu n'as pas besoin de constructeur par copie / destructeur / opérateur d'affectation pour ta classe MenuItem, tous ses membres sont bien copiables et détruits automatiquement. Le problème ne vient pas de là.

    ok , alors dans quel cas il faut un constructeur par recopie , je capte pas

    voila le code pour le slider :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    class DLLFUNC VGL_GUIComponent {				// GUI BaseClass
    	public:
                  VGL_GUIComponent();	
    	                                				virtual void SetPosition( const int x, const int y );
     
    	virtual void SetSize( const int width, const int height );	
     
    	virtual bool MouseOver();				virtual bool MouseOver( int &x, int &y );		
    	virtual void Draw() {};									
    	bool active;					void SetBackColor( Vector3 color );
     
    	int *pmouseX;
    	int *pmouseY;
    	int width;					
    	int height;	
    	protected:
     
    	int posX;						int posY;					
    };
     
     
    class DLLFUNC VGL_GUISlider : public VGL_GUIComponent {
    	public:
    		VGL_GUISlider();			
    		~VGL_GUISlider();									                VGL_GUISlider(const VGL_GUISlider &Slider1);
    		void SetRange( const float r );				virtual void SetSize( int width, int height );		                void Draw();	
    		float GetValue();
    		void  SetValue(float value);
    		void (*OnChange)(void);
    		float ratio;				
    	private:
    		float range;
    };
     
     
    DLLFUNC VGL_GUISlider::VGL_GUISlider(const VGL_GUISlider &Slider1) {
     
     
    	pmouseX = Slider1.pmouseX;
    	pmouseY = Slider1.pmouseY;
    	ratio     = Slider1.ratio;
    	OnChange  = Slider1.OnChange;
    	active    = Slider1.active;				
    	width   =  Slider1.width;
    	height  =  Slider1.height;// size : width
     
    	posX    = Slider1.posX;	
                    posY    = Slider1.posY;	
    	range   = Slider1.range;
     
    }


    Que dit le debugger et la pile d'appels de fonctions ?
    je tombe sur un interuption user breakpoint at 0x.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    77F6F570 CC                   int         3
     
    EAP[vbasecode.exe]: Invalid Address specified to RtlValidateHeap( 029C0000, 02AE1BF0 )



    Et attention avec les bibliothèques dynamiques : tout ce qui est alloué d'un coté (exe ou dll) doit être désalloué du même coté, sinon ça peut donner le genre d'erreur que tu as.
    oui ca je le sais , je pense pas que l erreur vienne de la


    Quel dommage de gacher la portabilité de GUI et de OpenGL avec cette macro...
    en l occurence la je developpe pour windows.Le jour ou je voudrais porter ca sous amiga je commencerais a y reflechir , mais elever cette macro sera pas le plus dur du travail à mon avis.

  14. #14
    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 : 40
    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
    ok , alors dans quel cas il faut un constructeur par recopie , je capte pas
    Le constructeur par copie généré par le compilateur appelle le constructeur par copie de toutes les données membres. Donc si ceux-ci sont bien définis, il n'y a aucun problème. Maintenant regarde ce que ça donne avec un tableau dynamique style C par exemple :

    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
    struct Test
    {
       int* Tab;
       int Taille;
     
       Test()
       {
          Tab = new int[50];
          Taille = 50;
       }
       ~Test()
       {
          delete[] Tab;
       }
    };
     
    int main()
    {
       Test* a = new Test;
       Test* b = new Test(a); // b est une copie de a
     
       delete a;
       delete b; // crash : a->Tab et b->Tab pointaient tous les 2 sur le même tableau, mais il a été detruit avec a
     
       return 0;
    }
    Il faut donc un constructeur par copie qui duplique le tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Test(const Test& T)
    {
       Taille = T.Taille;
       Tab = new int[Taille];
    }
    Et évidemment tout ceci ne vaut pas que pour le constructeur par copie, mais aussi pour le destructeur et l'opérateur d'affectation.

    je tombe sur un interuption user breakpoint at 0x.....
    Ce qui serait interessant c'est de savoir à quelle ligne de code amène le debugger, et quelle est la pile d'appels de fonctions à cet endroit par exemple.

    oui ca je le sais , je pense pas que l erreur vienne de la
    Est-ce que tu as lié avec la bibliothèque standard dynamiquement plutôt que statiquement ?

  15. #15
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    Le constructeur par copie généré par le compilateur appelle le constructeur par copie de toutes les données membres. Donc si ceux-ci sont bien définis, il n'y a aucun problème. Maintenant regarde ce que ça donne avec un tableau dynamique style C par exemple :
    Merci.

    je comprends bien ton exemple mais en l occurence si j ai pas de pointeur sur des tableaux alloués dynamiquement dans mes classes pas de probleme non ?

    Est-ce que tu as lié avec la bibliothèque standard dynamiquement plutôt que statiquement ?
    oula , aucune idéé lol c ou que tu vois ca , j utilise visual 6

  16. #16
    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 : 40
    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
    je comprends bien ton exemple mais en l occurence si j ai pas de pointeur sur des tableaux alloués dynamiquement dans mes classes pas de probleme non ?
    Oui, ici aucun problème c'est ce que je disais

    oula , aucune idéé lol c ou que tu vois ca , j utilise visual 6
    Project -> Settings -> onglet "C/C++" -> catégorie "Code Generation" -> Use run-time library -> "Multithreaded DLL" ou "Debug Multithreaded DLL" (le 1er pour la config Release, le second pour la Debug).

  17. #17
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut a ba oui
    a oui effectivement je suis tres con lol , la dll n avait pas la meme option que le exe et apparement c est ca qui faisait bugger le truc

    merci a tous

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

Discussions similaires

  1. probleme avec vector d'object
    Par johncrom dans le forum C++
    Réponses: 6
    Dernier message: 20/05/2009, 12h31
  2. petit probleme avec Vector
    Par Msakeni dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 11/12/2008, 19h28
  3. probleme avec vector.assign
    Par jahmanzaar dans le forum Débuter
    Réponses: 1
    Dernier message: 29/10/2008, 22h45
  4. probleme avec vector
    Par guitariste dans le forum C++
    Réponses: 2
    Dernier message: 26/12/2007, 16h23
  5. Probleme avec parcours de stl::vector
    Par MDiabolo dans le forum SL & STL
    Réponses: 10
    Dernier message: 08/03/2006, 00h35

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