Partage
  • Partager sur Facebook
  • Partager sur Twitter

Segmentation fault

Sujet résolu
    5 août 2008 à 19:27:20

    Bonjour :)

    Je suis en train de programmer un snake avec la SFML, et j'ai de nouveau un segmentation fault dont je n'arrive pas a identifier la cause. (j'aurai voulu poster sur mon précédent topic mais je ne peut pas faire deux post à la suite)

    Apparement ce segmentation fault apparait que si j'appuie sur droite/gauche/bas/haut et qu'il n'y a pas eu d'évenement avant (comme par exemple survoler la fenêtre avec la souris).

    Voici ce que m'indique mon débugueur :

    #0 00000000        Moteur::directionSnake(this=0x0, direction=3) (C:/Documents and Settings/Lionel/Bureau/programmes/snake/moteur.cpp:96)
    #1 00407099        Evenement::Evenement(this=0x2177e0, Event={Type = KeyPressed, {Key = {Code = Right, Alt = false, Control = false, Shift = false}, Text = {Unicode = 292}, MouseMove = {X = 292, Y = 0}, MouseButton = {Button = 292}, MouseWheel = {Delta = 292}, JoyMove = {JoystickId = 292, Axis = AxisX, Position = 6.24793492e+037}, JoyButton = {JoystickId = 292, Button = 0}, Size = {Width = 292, Height = 0}}}, mot=0x22f610) (C:/Documents and Settings/Lionel/Bureau/programmes/snake/evenement.cpp:35)
    #2 0040555A        main(argc=1, argv=0x3d27b8) (C:/Documents and Settings/Lionel/Bureau/programmes/snake/main.cpp:36)


    #ifndef DEF_EVENEMENT
    #define DEF_EVENEMENT
    
    #include <SFML/Graphics.hpp>
    
    #include "moteur.h"
    
    
    using namespace sf;
    
    class Evenement
    {
        public:
            Evenement(Event Event,Moteur *mot);
            void aucunEvent();
            void quitter(bool &quitter);
    
        private:
            void analyseEvent(Event Event);
            bool quit;
    
            Moteur *moteur;
    
    };
    
    
    
    #endif
    


    Evenement::Evenement(Event Event,Moteur *mot)
    {
      quit=false;
      analyseEvent(Event);
      moteur=mot;
    }
    
    void Evenement::analyseEvent(Event Event)
    {
        if (Event.Type == Event::KeyPressed)
        {
            switch (Event.Key.Code)
            {
                case Key::Left:
                    moteur->directionSnake(GAUCHE);
                    break;
    
                case Key::Right:
                    moteur->directionSnake(DROITE);
                    break;
    
                case Key::Up:
                    moteur->directionSnake(HAUT);
                    break;
    
                case Key::Down:
                    moteur->directionSnake(BAS);/*ligne ou ça plante*/
                    break;
    
                case Key::Escape:
                    quit=true;
                    break;
    
                default:
                    break;
            }
        }
    
        if (Event.Type == Event::Closed)
        {
            quit=true;
        }
    }
    


    #ifndef DEF_MOTEUR
    #define DEF_MOTEUR
    
    #include <SFML/Graphics.hpp>
    #include <vector>
    
    #include "constantes.h"
    #include "snake.h"
    
    
    using namespace sf;
    
    class Boule
    {
        public:
            Boule();
            int x;
            int y;
    };
    
    class Moteur
    {
        public:
            Moteur();
    
            int getSnakeX();
            int getSnakeY();
            int getDirectionSnake();
            int getNbPartieSnake();
            int getPositionPartieSnake(int numero);
            bool getPerdu();
            int getBouleX();
            int getBouleY();
    
            void getPartieSnakeX(Sprite snake[]);
            void getPartieSnakeY(Sprite snake[]);
    
            void directionSnake(int direction);
            void actualiser();
    
        private:
            void deplacerSnake();
            void deplacerPartieSnake();
            void positionBoule();
    
            int niveau[LARGEUR][HAUTEUR];
            bool perdu;
    
            Snake snake;
            Snake t;
            std::vector<Snake> partie_snake;
    
            Boule boule;
    
    };
    
    #endif
    


    void Moteur::directionSnake(int direction)
    {
        switch(direction)
        {
            case DROITE:
                switch(snake.direction)/*ligne ou cela plante*/
                {
                    case BAS:
                        snake.position=HAUT_DROITE;
                        break;
    
                    case DROITE:
                        snake.position=DG;
                        break;
    
                    case HAUT:
                        snake.position=DROITE_BAS;
                        break;
    
                    default:
                        break;
                }
                snake.direction=DROITE;
                break;
    
            case GAUCHE:
                switch(snake.direction)
                {
                    case BAS:
                        snake.position=GAUCHE_HAUT;
                        break;
    
                    case GAUCHE:
                        snake.position=DG;
                        break;
    
                    case HAUT:
                        snake.position=BAS_GAUCHE;
                        break;
    
                    default:
                        break;
                }
                snake.direction=GAUCHE;
                break;
    
            case HAUT:
                switch(snake.direction)
                {
                    case GAUCHE:
                        snake.position=HAUT_DROITE;
                        break;
    
                    case HAUT:
                        snake.position=HB;
    
                    case DROITE:
                        snake.position=GAUCHE_HAUT;
                        break;
    
                    default:
                        break;
                }
                snake.direction=HAUT;
                break;
    
            case BAS:
                switch(snake.direction)
                {
                    case GAUCHE:
                        snake.position=DROITE_BAS;
                        break;
    
                    case BAS:
                        snake.position=HB;
    
                    case DROITE:
                        snake.position=BAS_GAUCHE;
                        break;
    
                    default:
                        break;
                }
                snake.direction=BAS;
                break;
    
            case AUCUNE:
                switch(snake.direction)
                {
                    case DROITE:
                        snake.position=DG;
                        break;
    
                    case GAUCHE:
                        snake.position=DG;
                        break;
    
                    case HAUT:
                        snake.position=HB;
                        break;
    
                    case BAS:
                        snake.position=HB;
                        break;
    
                    default:
                        break;
    
                }
                break;
    
            default:
                break;
        }
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      5 août 2008 à 19:56:45

      this=0x0
      Ton moteur n'est pas declare.
      • Partager sur Facebook
      • Partager sur Twitter
        5 août 2008 à 20:13:31

        Et pourtant si, je ne comprend pas :

        #include <SFML/Graphics.hpp>
        #include <SFML/System.hpp>
        
        #include "evenement.h"
        #include "graphique.h"
        #include "moteur.h"
        
        using namespace sf;
        
        int main(int argc,char *argv[])
        {
            // Création de la fenêtre de rendu
            RenderWindow App(VideoMode(600, 600, 32), "Snake");
        
            Moteur moteur;
        
            Graphique graphique(&App,&moteur);
        
            float temps=0.f;
            Clock compteur;
        
            bool perdu=false;
        
            while (App.IsOpened())
            {
                bool quitter=false;
                temps=compteur.GetElapsedTime();
                if(temps >0.25)
                {
        
                    sf::Event Event;
                    Evenement evenement(Event,&moteur);
                    evenement.aucunEvent();
                    while (App.GetEvent(Event))
                    {
                        Evenement evenement(Event,&moteur);/*Analyse de l'evenement*/
                        evenement.quitter(quitter);
        
                        if(quitter==true)
                        {
                            App.Close();
                        }
        
        
                    }
                    moteur.actualiser();
                    compteur.Reset();
                }
                perdu=moteur.getPerdu();
                if(perdu)
                {
                    App.Close();
                }
                graphique.actualiserEcran();
                App.Display();/*mise a jour de l'écran du programme*/
            }
        
            return EXIT_SUCCESS;
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          5 août 2008 à 23:28:44

          Ton pointeur `mot' est initialisé seulement après l'analyse de l'évènement, c'est logique que le premier évènement plante si il doit utiliser cet objet.

          Suffit d'inverser les lignes 4 et 5 d'evenement.cpp pour que `mot' soit initialisé quand il faut.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            6 août 2008 à 0:47:33

            Un gros conseil : oublis les using (namespace surtout) dans les headers : essaye de compiler ça :
            #ifndef ...
            
            namespace n { void f (int); }
            using namespace n;
            
            #endif
            

            void f (int); // une autre fct f.
            #include "header.hpp"
            void g (void) { f(1); }
            

            et ben tu as un beau cas d'ambiguïté... ;)
            • Partager sur Facebook
            • Partager sur Twitter
              6 août 2008 à 1:11:58

              C'était bien ça Shisui merci ! ^^

              Citation : hiura

              Un gros conseil : oublis les using (namespace surtout) dans les headers



              D'accord, j'essayerai de faire gaffe :-°
              • Partager sur Facebook
              • Partager sur Twitter

              Segmentation fault

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown