Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de segmentation (core dumped)

Deplacer un personnage selon le clavier

Sujet résolu
    20 mars 2018 à 12:15:21

    Bonjour tout le monde

    je voudrai vous présenter un problème qui persiste depuis quelques jours et que je n'arrive pas a cerner

    je suis entrain de développer une fonction de deplacement d'un hero selon le clavier dés l'appui d'une touche le personnage avance d'un pas en changeant son image pour avoir l'impression qu'il bouge mais lors de l'execusion il ya une erreur mais je ne la vois pas

    //la structure du hero
    typedef struct perso 
    {
    	SDL_Surface *image[8];
    	SDL_Surface *imgActuel;
    	SDL_Rect position;
    }perso;
    void deplacerPerso(perso *p)
    
    {
    
    SDL_Surface *screen = NULL,*image=NULL,*imag1=NULL,*imag2=NULL ,*imag3=NULL ,*imag4=NULL ,*imag5=NULL ,*imag6=NULL ,*imag7=NULL ,*imag8=NULL,*imagee=NULL;
    SDL_Rect positionimag1,positionimag2,positionimage,positionimag3,positionimag4,positionimag5,positionimag6,positionimag7,positionimag8,positionimagee;
    
        SDL_Event event;
    
        int continuer = 1,i=1,etat=0;
        
    init_perso(&p); //initialiser notre hero//
    
    
        SDL_Init(SDL_INIT_VIDEO);
    
    
        screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); /* Double Buffering */
    
        SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);
    
    //on charge les images
    imag1 = IMG_Load("image1.png");
    imag2 = IMG_Load("image2.png");
    imag3=IMG_Load("image3.png");
    imag3=IMG_Load("image4.png");
    imag4=IMG_Load("image5.png");
    imag5=IMG_Load("image6.png");
    imag6=IMG_Load("image7.png");
    imag7=IMG_Load("image8.png");
    
    imagee=SDL_LoadBMP("lac.bmp");//la map dans cette place//
    
          
    //on positionne les images
        positionimag1.x = screen->w / 2 - imag1->w / 2;
    
        positionimag1.y = screen->h / 2 - imag1->h / 2;
    
    positionimag2.x = screen->w / 2 - imag2->w / 2;
    
        positionimag2.y = screen->h / 2 - imag2->h / 2;
    
    positionimag3.x = screen->w / 2 - imag3->w / 2;
    
        positionimag3.y = screen->h / 2 - imag3->h / 2;
    
      positionimag4.x = screen->w / 2 - imag4->w / 2;
    
        positionimag4.y = screen->h / 2 - imag4->h / 2;
    
    positionimag5.x = screen->w / 2 - imag5->w / 2;
    
        positionimag5.y = screen->h / 2 - imag5->h / 2;
    
    
    
    positionimag6.x = screen->w / 2 - imag6->w / 2;
    
        positionimag6.y = screen->h / 2 - imag6->h / 2;
    
    
    
    positionimag7.x = screen->w / 2 - imag7->w / 2;
    
        positionimag7.y = screen->h / 2 - imag7->h / 2;
    
    
    positionimag8.x = screen->w / 2 - imag8->w / 2;
    
        positionimag8.y = screen->h / 2 - imag8->h / 2;
    
    positionimagee.x=0;
    positionimagee.y=0;
    
    
    
    
    
        //SDL_EnableKeyRepeat(10, 10); /* Activation de la répétition des touches */
    
    
        while (continuer)
    
        {
    
            SDL_WaitEvent(&event);
    
            switch(event.type)
    
            {
    
                case SDL_QUIT:
    
                    continuer = 0;
    
                    break;
    
                case SDL_KEYDOWN:
    
                    switch(event.key.keysym.sym)
    
                    {
    
                        case SDLK_UP:
                switch(i)
                 {case 1:
    
                         positionimag1.y--;//limage 1 se deplace
                p->position=positionimag1;//la position de l'mage est affectée a la position du hero
                   p->image[1]=imag1; //l'mage est affectée a limage de l'hero
                     p->imgActuel=p->image[1];//notre image est actuel est cette image
                  
                         i=2;
                       etat=1;
                          break;
                    case 2:
    
                         positionimag2.y--;
                       p->position=positionimag2;
                   p->image[2]=imag2;
                         p->imgActuel=p->image[2];
                       i=1;
                    etat=2;
                         break;
                      };
                            break;
    
                        case SDLK_DOWN:
                     switch(i)
                        {
                        case 1:
                      positionimag3.y++;
                          p->position=positionimag3;
                   p->image[3]=imag3;
                         p->imgActuel=p->image[3];
                              i=2;
                           etat=3;
                             break;
                         case 2:
                     positionimag4.y++;
                        p->position=positionimag4;
                   p->image[4]=imag4;
                         p->imgActuel=p->image[4];
                     i=1;
                   etat=4;
                       
                       break;
                      };
    
                            break;
    
                        case SDLK_RIGHT:
                       switch(i)
          {                
                         case 1:
    
              
                            positionimag5.x++;
                        p->position=positionimag5;
                   p->image[5]=imag5;
                         p->imgActuel=p->image[5];
              
                    
                             i=2;
    etat=5;
                         break;
                         case 2:
                   
                  
    
                   positionimag6.x++;
                     p->position=positionimag6;
                   p->image[6]=imag6;
                         p->imgActuel=p->image[6];
              
                     i=1;
    etat=6;
                     break;
                         };
                    break;
    
                        case SDLK_LEFT:
                        switch(i)
                           {
                              case 1:    
    
                            positionimag7.x--;
                        p->position=positionimag7;
                   p->image[7]=imag7;
                         p->imgActuel=p->image[7];
              
                             i=2;
                               etat=7;
                               break;
    
                          case 2:
                          positionimag8.x--;
                       p->position=positionimag8;
                   p->image[8]=imag8;
                         p->imgActuel=p->image[8];
              
                        i=1;
                           etat=8;
                            break;
                           };
    
    
                            break;
    
                    }
    
                    break;
    
            }
    
    
            SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    
     
    
     if(etat==1)
    
    {
    SDL_BlitSurface(imagee, NULL, screen, &positionimagee);
     
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));
     
    
    }
    
    
    else if(etat==2)
    {SDL_BlitSurface(imagee, NULL, screen, &positionimagee); 
    
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));
    }
    
     else if(etat==3)
    {SDL_BlitSurface(imagee, NULL, screen, &positionimagee); 
    
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));}
     else if(etat==4)
    {SDL_BlitSurface(imagee, NULL, screen, &positionimagee); 
    
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));}
    else if(  etat==5)
    {SDL_BlitSurface(imagee, NULL, screen, &positionimagee); 
    
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));}
    
    else if(etat==6)
    {SDL_BlitSurface(imagee, NULL, screen, &positionimagee); 
    
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));}
    
     else if(etat==7)
    {SDL_BlitSurface(imagee, NULL, screen, &positionimagee); 
    
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));}
     
    else if(etat==8)
    { 
    SDL_BlitSurface(imagee, NULL, screen, &positionimagee); 
    
    SDL_BlitSurface(p->imgActuel, NULL, screen, &(p->position));}
      
    
     
     SDL_Flip(screen);
          
    
    
        }
    
       SDL_FreeSurface(imagee);
    
    SDL_FreeSurface(p->image[1]);
    SDL_FreeSurface(p->image[2]);
    SDL_FreeSurface(p->image[3]);
    SDL_FreeSurface(p->image[4]);
    SDL_FreeSurface(p->image[5]);
    SDL_FreeSurface(p->image[6]);
    SDL_FreeSurface(p->image[7]);
    SDL_FreeSurface(p->image[8]);
    
        SDL_Quit();
    
    
        
    
    }
    int main()
    {person p;
    deplacerperso(&p);}

    excusez moi si mon code est trop long mais je suis débutante et j'aimerai bien connaitre le probleme qui s'affiche

    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000400d67 in deplacerPerso ()
    (gdb) where
    #0  0x0000000000400d67 in deplacerPerso ()
    #1  0x0000000000401677 in main ()
    

    merci



    -
    Edité par MESTIRIYasmine 20 mars 2018 à 12:19:53

    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2018 à 13:02:54

      Les index de tableaux commencent a 0.

      Donc quand tu déclares :

      int monTableau[8];

      Ca veut dire que les index vont de 0 a 7 (inclus).
      Si tu fais monTableau[8] tu es dehors de ton tableau et ça va provoquer un crash.
      C'est exactement ce qui t'arrives ;)

      Ps : ta fonction s'appelle déplacerPerso mais c'est clairement pas son rôle. Elle fait tout, elle contient même ta boucle de jeu actuellement. Pas sûr qu'elle porte le bon nom.

      -
      Edité par ironwolf151 20 mars 2018 à 15:08:57

      • Partager sur Facebook
      • Partager sur Twitter
        21 mars 2018 à 18:27:19

        ah oui c’était évident :o  je vais y retourner merci
        • Partager sur Facebook
        • Partager sur Twitter

        Erreur de segmentation (core dumped)

        × 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