Partage
  • Partager sur Facebook
  • Partager sur Twitter

[sdl] demineur

erreur de segementation

    9 mai 2006 à 20:24:21

    bonjour,

    j'ai creé un demineur qui a plusieurs bugs dont la cause me parait introuvable! :(
    d'abord les surfaces du jeu ne s'affichent pas. :colere2:
    ensuite lorsque l'on clique sur la fenêtre le programme s'arrête et si l'on l'exécute avec le debug un sympathique petit message apparait:
    "une violation d'accés (erreur de segementation) est apparue dans votre programme." :(

    enfin je vous envoie le code:
    //jeu.c
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <time.h>



    enum SURFACES
    {
             VIDE ,UN,DEUX,TROIS,QUATRE,CINQ,SIX,SEPT,HUIT,
         DRAPEAU,MINE,EXPLOSION,NON_DECOUVERT,DECOUVERT,
    };

    void game()
    {
            //allocations 
            SDL_Surface *ecran=NULL, *carre[13] = {NULL}
            SDL_Event event;
        FILE* option = NULL;
        int largeur = 0, hauteur = 0, nombreDeMine = 0;
            int minePlacee=0, i=0, j=0,continuer = 1,k,x,y,Mine;
        SDL_Rect pos;
           
            //chargement des decorts
            carre[VIDE] = IMG_Load("carre_vide.jpeg");
            carre[UN] = IMG_Load("carre_1.jpeg");
            carre[DEUX] = IMG_Load("carre_.jpeg2");
            carre[TROIS] = IMG_Load("carre_3.jpeg");
            carre[QUATRE] = IMG_Load("carre_4.jpeg");
            carre[CINQ] = IMG_Load("carre_5.jpeg");
            carre[SIX] = IMG_Load("carre_6.jpeg");
            carre[SEPT] = IMG_Load("carre_7.jpeg");
            carre[HUIT] = IMG_Load("carre_8.jpeg");
            carre[DRAPEAU] = IMG_Load("drapeau.jpeg");
            carre[MINE] = IMG_Load("mine.jpeg");
            carre[EXPLOSION] = IMG_Load("mine_explosee.jpeg");
            carre[NON_DECOUVERT] = IMG_Load("carre_non_decouvert.jpeg");
           
            //chargement des option
            option = fopen("option.txt","r");   
           
            if (option != NULL)
        {
            fscanf(option,"%ld %ld %ld", &largeur,&hauteur,&nombreDeMine);
        }
        else
        {
           
            fprintf(stderr,"Impossible d'ouvrir le fichier options.txt");
            exit (0);
        }
       
        //allocation dynamique de la carte
        int **carte;

        carte = malloc( largeur * sizeof(int*));

        if( carte == NULL )
          {
           fprintf(stderr,"Allocation impossible");
           exit(EXIT_FAILURE);
           }

        for( i = 0 ; i < largeur ; i++ )
        {
           carte[i] = calloc (hauteur, sizeof(int));
         
         if( carte[i] == NULL )
           { 
              fprintf(stderr,"Allocation impossible");
              exit(EXIT_FAILURE);
           }
        }
       
        fclose(option);
       
        //remplissage de la carte
             //placement des carre vide
        for(i=0;i<largeur;i++)
        {
                                                  for(j=0;j<hauteur;j++)
                                                  {
                                                  carte[i][j]=NON_DECOUVERT;
                                                    }
         }
                                                 
       
             //placement des mines
        srand(time(NULL));
       
        while (minePlacee != nombreDeMine)
        {
                     
              i = (rand() % (largeur)) ;
              j = (rand() % (hauteur)) ;
              if(carte[i][j]=NON_DECOUVERT)
              {
                                                   minePlacee++;
                                                   carte[i][j] =MINE;
                       }
             
             
             
         }
       
       
        //redimentionnage de la fennetre
       
       ecran=SDL_SetVideoMode(16*largeur,16*hauteur,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
         
             //boucle principale
            while(continuer)
            {
           
                //blits
         for(i=0;i<largeur;i++)
         {
                                               for(j=0;j<hauteur;j++)
                                               {
                                                                                      pos.x = i*16;
                                                                                      pos.y = j*16;
                                                                                      switch(carte[i][j])
                                                                                      {
                                                                                                                                    case NON_DECOUVERT:
                                                                                                                                                     SDL_BlitSurface(carre[NON_DECOUVERT], NULL, ecran, &pos);
                                                                                                                                                     break
                                                                                                                                            case MINE:
                                                                                                                                                     SDL_BlitSurface(carre[NON_DECOUVERT], NULL, ecran, &pos);
                                                                                                                                                     break
                                                                                                                                            case VIDE:
                                                                                                                                                     SDL_BlitSurface(carre[VIDE], NULL, ecran, &pos);
                                                                                                                                                     break
                                                                                                                                            case UN:
                                                                                                                                                     SDL_BlitSurface(carre[UN], NULL, ecran, &pos);
                                                                                                                                                     break;     
                                                                                                                                            case DEUX:
                                                                                                                                                     SDL_BlitSurface(carre[UN], NULL, ecran, &pos);
                                                                                                                                                     break
                                                                                                                                            case TROIS:
                                                                                                                                                     SDL_BlitSurface(carre[TROIS], NULL, ecran, &pos);
                                                                                                                                                     break;
                                                                                                                                        case QUATRE:
                                                                                                                                                     SDL_BlitSurface(carre[QUATRE], NULL, ecran, &pos);
                                                                                                                                                     break
                                                                                                                                        case CINQ:
                                                                                                                                                     SDL_BlitSurface(carre[CINQ], NULL, ecran, &pos);
                                                                                                                                                     break;
                                                                                                                                        case SIX:
                                                                                                                                                     SDL_BlitSurface(carre[SIX], NULL, ecran, &pos);
                                                                                                                                                     break;
                                                                                                                                        case SEPT:
                                                                                                                                                     SDL_BlitSurface(carre[SEPT], NULL, ecran, &pos);
                                                                                                                                                     break;
                                                                                                                                        case HUIT:
                                                                                                                                                     SDL_BlitSurface(carre[HUIT], NULL, ecran, &pos);
                                                                                                                                                     break;
                                                                                                                                        case DRAPEAU:
                                                                                                                                                     SDL_BlitSurface(carre[DRAPEAU], NULL, ecran, &pos);
                                                                                                                                                     break;
                                                                                                                                        case EXPLOSION:
                                                                                                                                                     SDL_BlitSurface(carre[EXPLOSION], NULL, ecran, &pos);
                                                                                                                                                     break;
                                                                                             }
                                                                                             SDL_Flip(ecran);
                                                 }
         }
         SDL_WaitEvent(&event);
         
         switch (event.type)
         {
                            case SDL_QUIT:
                           exit(0);

                /*case SDL_KEYDOWN:
                                     switch(event.key.keysym.sym)
                                     {
                                                                                 case SDLK_CLEAR:
                                                                                                      continuer = 0;
                                                                                                      break;
                                     }*/

                             case SDL_MOUSEBUTTONDOWN:
                      if (event.button.button == SDL_BUTTON_LEFT)
                                             {
                                                                     if(carte[event.button.x/16][event.button.y/16] == MINE)
                                                                        continuer = 0;
                                                                  else
                                                                                      {
                                                                                             x = event.button.x/16;
                                                                                         y = event.button.y/16;   
                                                                     do
                                                                     {        
                                                                                                      k= 0
                                                                                                  Mine =0;
            
                           
                                                                               for(i=-1;i<2;i++)
                                                                                 {
                                                                            for(j=-1;j<2;j++)
                                                                            {
                                                                            if (carte[i+x][j+y]==MINE)
                                                                                            Mine++;
                                                                            else if(carte[i+x][j+y]==NON_DECOUVERT)
                                                                                                                            carte[i+x][j+y]=DECOUVERT;   
                                                                          
                                    }
                                  }
                                            carte[x][y] = Mine;
                                                             for(i=0;i<largeur;i++)
                                                             {
                                                                 for(j=0;j<hauteur;j++)
                                                                 {
                                                                     if(carte[i][j] ==DECOUVERT)
                                                                     {
                                                                                                                                            k++;
                                                                                                                                            x=i;
                                                                                                                                            y=j;
                                                                                                                       }   
                                                                                                               }             
                                                                  }
                                                                          }while(k);
                                                                                       }
                                               }
                               else if (event.button.button == SDL_BUTTON_RIGHT  )
                               {
                                                    switch(carte[event.button.x/16][event.button.y/16])
                                                    {
                                                            case DRAPEAU:
                                                                    carte[event.button.x/16][event.button.y/16] = NON_DECOUVERT;
                                                                break;
                                                                            
                                                            case NON_DECOUVERT:
                                                                    carte[event.button.x/16][event.button.y/16] =DRAPEAU;
                                                                break;   
                                                    }
                                                                                         
                                                                   
                                            }
              }
         
        }
         
         //liberation ce la memoire
         for ( i = 0 ; i<largeur ; i++)
          {
              free(carte[i]);
              carte[i] = NULL ;
          }
         free(carte);
         carte = NULL;
           
             for(i=0;i<13;i++)     
             SDL_FreeSurface(carre[i]);            

       
       
       
    }



    et je vous envoie main.c ,on sait jamais où les erreurs peuvent être:
    //main.c
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "reglages.h"
    #include "jeu.h"


    int main(int argc, char *argv[])
    {
            SDL_Surface *ecran=NULL , *menu=NULL;
            SDL_Rect positionMenu;
            SDL_Event event;
            
            
            int continuer = 1;
            
        SDL_Init(SDL_INIT_VIDEO);

        //SDL_WM_SetIcon(IMG_Load("caisse.jpg"), NULL);
        ecran = SDL_SetVideoMode(300,300,32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Demineur", NULL);

        menu = IMG_Load("menu.jpg");
        positionMenu.x = 0;
        positionMenu.y = 0;

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Veut arrêter le jeu
                            continuer = 0;
                            break;
                       
                    }
                    break;
                 case SDL_MOUSEBUTTONDOWN :
                                     if(event.button.x < 268 &&  event.button.x > 46)
                                     {
                                                                 if(event.button.y < 221 && event.button.y > 175)
                                                                     {
                                                                                     game();
                                                                                     ecran = SDL_SetVideoMode(300,300,32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                                                                                     }
                                                                 if(event.button.y < 282 && event.button.y > 242)
                                                                  /*   options()*/;
                                  }
            }

            // Effacement de l'écran
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
            SDL_Flip(ecran);
        }

        SDL_FreeSurface(menu);
        SDL_Quit();

        return EXIT_SUCCESS;
    }



    merci d'avence.
    • Partager sur Facebook
    • Partager sur Twitter
      12 mai 2006 à 15:19:03

      j'ai remarqué que les variables envent.button.x et event.buuton.y avaient des valeurs bizarre:
      soit '?' soit des valeur qui voudrais dire que j'ai cliqué en dehors de la fenêtre ou de mon ecran.
      • Partager sur Facebook
      • Partager sur Twitter
        12 mai 2006 à 15:41:21

        vite fait pour dire que d' avance s ecrit avec deux 'a' et données avec deux 'e'.
        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2006 à 11:53:28

          J'ai pas lu tout ton code en détail (trop le flemme) mais dans jeu.c, j'ai pas vu beaucoup de SDL_Flip(ecran)...
          Ton problème vient peut-être de là (moi je sais que je l'oublie de temps en temps. ^^ )
          • Partager sur Facebook
          • Partager sur Twitter
            17 juin 2006 à 14:15:23

            Mouarf, courageux de faire un démineur... Faudrait peut-être que je tente l'affaire :p
            • Partager sur Facebook
            • Partager sur Twitter
              17 juin 2006 à 14:19:57

              En fait c'est pas si compliqué que ça. Faut juste faire les choses dans l'ordre et de manière structurée...
              • Partager sur Facebook
              • Partager sur Twitter

              [sdl] demineur

              × 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