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

C++ Discussion :

Crash a la création d'un attribut


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut Crash a la création d'un attribut
    Bonjour/bonsoir, c'est encore moi

    Je viens car j'ai (encore) un problème. J'ai trois classes: Scene, GuiScreen et GuiTest. GuiTest hérite de GuiScreen.

    Scene.h
    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
    #ifndef DEF_SCENE
    #define DEF_SCENE
     
    #include "Engine.h"
    #include "GuiTest.h"
     
    class Scene
    {
        public:
     
        Scene();
        ~Scene();
     
        void Draw();
     
        void Update();
     
        protected:
     
        GuiTest m_guiTest; ///C'est ici que ca plante
    };
     
    #endif
    Scene.cpp
    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
    #include "Scene.h"
     
    Scene::Scene()
    {
     
    }
     
    Scene::~Scene()
    {
     
    }
     
    void Scene::Draw()
    {
     
    }
     
    void Scene::Update()
    {
     
    }
    GuiTest.h
    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
    #ifndef DEF_GUITEST
    #define DEF_GUITEST
    #include "Gui.h"
    #include "GuiScreen.h"
    #include "GuiScreen.h"
    #include "GuiButton.h"
    #include <iostream>
     
    class GuiTest : public GuiScreen
    {
        public:
        GuiTest();
        ~GuiTest();
     
        void Update();
    };
     
    #endif
    GuiTest.cpp
    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
    #include "GuiTest.h"
     
    GuiTest::GuiTest()
    {
        std::cout<<"GuiTest()"<<std::endl;
        addGui(new GuiButton(10, 10, 70, 20, "test1"));
        addGui(new GuiButton(10, 40, 70, 20, "test2"));
    }
     
    GuiTest::~GuiTest()
    {
        delete m_guiList[0];
    }
     
    void GuiTest::Update()
    {
        std::cout<<"GuiTest is updating"<<std::endl;
        if(m_guiList[0]->isClicked())
        {
            std::cout<<"button is clicked"<<std::endl;
        }
    }
    GuiScreen.h
    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
    #ifndef DEF_GUISCREEN
    #define DEF_GUISCREEN
    #include <vector>
    #include "Gui.h"
     
    class GuiScreen : public Gui
    {
        protected:
     
        std::vector<Gui*> m_guiList;
     
        public:
     
        GuiScreen();
        void swap(GuiScreen &guiScreen);
        GuiScreen(int x, int y, int height, int width);
        ~GuiScreen();
        virtual void Update();
     
        void addGui(Gui* gui);
     
        int getGuiListSize();
        Gui* getGui(int index);
    };
     
    #endif
    GuiScreen.cpp
    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
    #include "guiscreen.h"
     
    using namespace std;
    using namespace sf;
     
    GuiScreen::GuiScreen() :
    m_guiList(0)
    {
     
    }
     
     
    GuiScreen::GuiScreen(int x, int y, int height, int width):
    Gui(x, y, height, width),
    m_guiList(0)
    {
     
    }
     
    GuiScreen::~GuiScreen()
    {
        for(int i(0); i<m_guiList.size(); ++i)
        {
            delete m_guiList[i];
        }
    }
     
    void GuiScreen::Update()
    {
     
    }
    void GuiScreen::addGui(Gui* gui)
    {
        m_guiList.push_back(gui);
    }
     
    int GuiScreen::getGuiListSize()
    {
        return m_guiList.size();
    }
     
     
    Gui* GuiScreen::getGui(int index)
    {
        return m_guiList[index];
    }
    Lorsque, a la ligne 20 de mon scene.h, je veut créer un GuiTest le programme plante. Quelqu'un a t'il une idée? Ne faite pas attention au std::cout c'etait juste pour "debugger" a l'artisanal étant donné que le call stack de code::block me donne des informations pas très explicites.
    PS: Lorsque je créer un GuiTest dans main.c par exemple tout fonctionne bien.

    Merci d'avoir (encore) lu mon pavé, j’espère que j'ai rien oublier et que mon message est compréhensible malgré les fautes d'orthographe.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    on est bien d'accord que par définition, un .h ne contient que des déclarations?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    Oui par "créer" je veut dire "déclarer" après je compte l'initialiser dans le .cpp mais vu que ça crache la déclaration je ferais ça plus tard.

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Negatio Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    GuiTest::~GuiTest()
    {
        delete m_guiList[0];
    }
    L'attribut appartient à GuiScreen, c'est à lui de le supprimer, pas à GuiTest. (surtout que GuiScreen le supprime aussi)
    Penses à mettre tes destructeurs virtuels pour toutes tes classes héritées.

    Sinon le problème ne vient pas des classes montrées, donc probablement de Gui ou GuiButton. (j'ai utilisé des structures vides pour tester ton code à la place de ces deux classes, me semble pas qu'il y ai de problème dans le code présenté donc).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Gui {
    	Gui() { }
    	Gui(int, int, int, int) { }
    };
     
     
    struct GuiButton: Gui {
    	GuiButton(int, int, int, int, char*) { }
    };

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    Merci pour cet réponse.

    L'attribut appartient à GuiScreen, c'est à lui de le supprimer, pas à GuiTest.
    C'est vrai, j'y avait pas penser.

    Je poste les classes Gui et GuiButton on sait jamais.

    Gui.h
    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
    #ifndef DEF_GUI
    #define DEF_GUI
    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
    #include "Engine.h"
    #include "EngineRender.h"
    #include "EngineWindow.h"
    #include "EngineControl.h"
     
     
    class Gui
    {
        public:
     
        Gui();
        Gui(int x, int y, int height, int width);
        ~Gui();
        sf::IntRect getRect();
     
        virtual sf::Sprite getSprite();
        virtual void draw();
        virtual bool isPointed();
        virtual bool isClicked();
     
        protected:
     
        sf::Sprite m_sprite;
        sf::IntRect m_rect;
     
    };
     
    #endif
    Gui.cpp
    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
    #include "Gui.h"
     
    using namespace std;
    using namespace sf;
     
    Gui::Gui()
    {
     
    }
     
    Gui::Gui(int x, int y, int height, int width) 
    {
        m_rect.top = x;
        m_rect.left = y;
        m_rect.width = width;
        m_rect.height = height;
    }
     
    Gui::~Gui()
    {
     
    }
     
    IntRect Gui::getRect()
    {
        return m_rect;
    }
     
    sf::Sprite Gui::getSprite()
    {
     
    }
     
    void Gui::draw()
    {
     
    }
     
    bool Gui::isPointed()
    {
     
    }
     
    bool Gui::isClicked()
    {
     
    }
    GuiButton.h
    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
    #ifndef DEF_GUIBUTTON
    #define DEF_GUIBUTTON
    #include "Gui.h"
     
    class GuiButton : public Gui
    {
        private:
     
        sf::Sprite m_sprite;
        sf::Texture m_released;
        sf::Texture m_pressed;
        int m_state;
        sf::String m_label;
     
        public:
     
        GuiButton();
        GuiButton(int x, int y, int height, int width, sf::String label);
        ~GuiButton();
        bool isPointed();
        bool isClicked();
     
        sf::Sprite getSprite();
     
        void draw();
    };
     
    #endif
    GuiButton.cpp
    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
    #include "GuiButton.h"
     
    using namespace std;
    using namespace sf;
     
    GuiButton::GuiButton() :
    m_label(" ")
    {
     
    }
     
    GuiButton::GuiButton(int x, int y, int height, int width, sf::String label) :
    Gui(x, y, height, width),
    m_label(label)
    {
        m_released.loadFromImage(Engine::engineRender.makeImage(Engine::engineRender.Button, m_rect.height, m_rect.width));
        m_pressed.loadFromImage(Engine::engineRender.makeImage(Engine::engineRender.ButtonP, m_rect.height, m_rect.width));
        m_sprite.setTexture(m_released);
        m_sprite.setPosition(m_rect.top, m_rect.left);
    }
     
    GuiButton::~GuiButton()
    {
     
    }
     
    bool GuiButton::isPointed()
    {
        if(m_rect.contains(Engine::engineControl.getMousePosition().x, Engine::engineControl.getMousePosition().y))
        return true;
    }
     
    bool GuiButton::isClicked()
    {
     
    }
     
    Sprite GuiButton::getSprite()
    {
        return m_sprite;
    }
     
    void GuiButton::draw()
    {
        Engine::engineWindow.drawSprite(m_sprite);
    }
    EDIT:

    Il se passe un truc étrange. Je cherchais encore la source du problème en plaçant de multiples std::cout (oui je sait, c'est pas bien ), j'en ai placer un a la ligne 16 de GuiButton.cpp et le programme ne crash plus! Cela dit il ne fait totalement ce qu'il est censé faire. Comment un std::cout peut empêcher un programme de planter? Décidément les arcanes du c++ sont pour moi plutôt obscures .

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    Personne n'a d'idées?

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Un comportement de ce type traduit un problème subtil:

    Tu as un comportement indéfini par la norme quelque part dans ton code.
    Active plus de warning de compilation, cherche une fuite mémoire, tu pourrais avoir des indices.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    J'ai régler presque tout les warnings, il m'en reste seulement deux, peut-être la cause?

    C:\Users\Negatio\Desktop\C++ SFML\Test 3\GuiButton.cpp|31|warning: control reaches end of non-void function|

    C:\Users\Negatio\Desktop\C++ SFML\Test 3\GuiScreen.cpp|22|warning: comparison between signed and unsigned integer expressions|

    Pour ce qui est des fuites mémoires je sait pas vraiment les détecter, j'arrive a peine a me servir du debug.

  9. #9
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    1- Une fonction qui devrait retournée une valeur n'est pas sûr d'en retournée une, si tu as une sortie "return" dans une boucle, pense à en mettre un par défaut à la fin.

    2- Doit être que tu compare une taille de tableau avec une variable int, soit la transformée en "unsigned int" ou placer une parenthèse pour lui préciser la transformation : (int)tableau.begin()

    [edit] Si tu n'utilise pas de vecteur, tu n'auras pas de fuite.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Le premier a plus que largement des chances d'être la cause de l'erreur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    Merci;

    Grace a PilloBuenaGente j'ai pu régler mais deux warning mais mon programme crash toujours.

    Je crois que je vais supprimer ce nid a problème qu'est ma liste de pointeurs (m_guiList) pour la remplacer par plusieurs attribut (button1, button2,...) ca me parait plus pratique a gérer (pas de polymorphisme, pas de pointeurs, pas de tableau). Je vous donne des nouvelles plus tard.

    ------------------------------
    Apres avoir fait les modifications
    -------------------------------

    J'ai donc supprimer mon vector<Gui*> (dans GuiScreen) et l'ai remplacé un GuiButton button1 (dans GuiTest). Mais a mon grand regret ca crash encore... J’avoue ne pas vraiment comprendre la source du plantage du-coup.

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Par défaut
    J'ai enfin trouver la source du crash: une boucle dans Engine::engineRender.makeImage().

    Merci pour votre aide. (surtout que vous risquiez pas de trouver, je vous avez pas donner la bonne classe :/).

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

Discussions similaires

  1. Création de table attribut des champs
    Par allexpert dans le forum Développement
    Réponses: 4
    Dernier message: 01/02/2010, 14h45
  2. [Dojo] Création de class: attribut de type instance d'objet
    Par Zineb1987_UNI dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 08/12/2009, 10h21
  3. Création d'un attribut dynamique pour un object
    Par supernova dans le forum Flash/Flex
    Réponses: 1
    Dernier message: 24/11/2009, 15h54
  4. Création d'un attribut de type tableau en base
    Par Toph1 dans le forum W4 Express
    Réponses: 0
    Dernier message: 06/02/2009, 15h41
  5. Création de dossier -> attribut lecture seule VB6 / XP
    Par ben f dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/02/2008, 09h05

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