Probleme: erreur de segmentation

Grunge_8666 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
J'ai un petit problème...
Pour faire simple, c'est un programme qui récupère les données d'un fichier circuit.txt
et qui, stockées dans des variables, vont être réutilisées pour la construction d'un circuit 2D en sdl2.
Le problème est que je me retrouve avec un seg fault mais je ne sais pas d'où cela peut-il venir.
Voici donc mon code si quelqu'un arrive à m'aider:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

/**********directives de préprocesseur*****/
#define BUFFER_SIZE 2048
#define pos_x 0
#define pos_y 0
#define TAILLE_h 800
#define TAILLE_w 600
/***********definition des fonctions et structures*********/
int messageErreur()/**fonction de limite d'erreur lors de l'initialisation**/
{
  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"[DEBUG] > %s",SDL_GetError());
 return EXIT_FAILURE;
}

typedef struct 
{
 int type;
 char skin[50];
}Struct_zone;

/************début***********/

int main( int argc, char** argv ){
/************déclaration des variables*********/
    const char *delimiter_characters = " \n\r";
    const char *filename = "circuit.txt";
    FILE *input_file = fopen( filename, "r" );
    char buffer[ BUFFER_SIZE ];
    char *last_token;
    char fond[30];
    char voiture[30];
    char map;


    int taille_x,taille_y,a=0,h,w,p,depart_x,depart_y,Nbr_zone,r,e,d;
    int **carreaux;
    float angle_depart;
  
    Struct_zone * zone;
/***********ouverture fichier******/
    if( input_file == NULL ){

        fprintf( stderr, "Unable to open file %s\n", filename );

    }
    else
    {

        // lecture de chaque ligne du buffer
        while( fgets(buffer, BUFFER_SIZE, input_file) != NULL )
 {

            // definition de chauqetoken en tant que string
            last_token = strtok( buffer, delimiter_characters );
            while( last_token != NULL )
  { //récupération des données de TAILLE
   if (strcmp(last_token,"TAILLE")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    taille_x=atoi(last_token );
    last_token = strtok( NULL, delimiter_characters );
    taille_y=atoi(last_token );
    carreaux= malloc(sizeof(int*)*taille_x);
    for(int p=0;p<taille_x; p++)
    {carreaux[p]=malloc(sizeof(int**)*taille_y);}
    
   }
   //récupération des données de FOND
   if (strcmp(last_token,"FOND")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    strcpy(fond,last_token);
   }
   //récupération des données de NBZONES
   if (strcmp(last_token,"NBZONES")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    Nbr_zone=atoi(last_token);
    zone=malloc(sizeof(Struct_zone)*Nbr_zone);

   }
   //récupération des données de VOITURE
   if (strcmp(last_token,"VOITURE")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    strcpy(voiture,last_token);
    
   }
   //récupération des données des ZONES
   if (strcmp(last_token,"ZONE")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    zone[a].type=atoi(last_token);
    last_token = strtok( NULL, delimiter_characters );
    strcpy(zone[a].skin,last_token);
    a++;
    
   }
   //récupération des coordonnées de DEPART
   if (strcmp(last_token,"DEPART")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    depart_x=atoi(last_token );
    last_token = strtok( NULL, delimiter_characters );
    depart_y=atoi(last_token );
    
   }
   //récupération des coordonnées d'ARRIVEE
   if (strcmp(last_token,"ARRIVEE")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    depart_x=atoi(last_token );
    last_token = strtok( NULL, delimiter_characters );
    depart_y=atoi(last_token );
    
   }
   //récupération des données sur l'angle de DEPART
   if (strcmp(last_token,"ANGLE_DEPART")==0)
   {
    last_token = strtok( NULL, delimiter_characters );
    angle_depart=atof(last_token );
   }
   //récupération de la map
   for(h=0;h<taille_y;h++)
   { if (h==0)
      {
    fgets(buffer,BUFFER_SIZE,input_file)!= NULL;
          last_token = strtok( buffer, delimiter_characters );
      }
    else
    {fgets(buffer,BUFFER_SIZE,input_file)!= NULL;
          last_token = strtok( buffer, delimiter_characters );}

      for(w=0;w<taille_x;w++)
               {if (w==0)
                      {
                        last_token = strtok(NULL, delimiter_characters);
                      }
     
                       carreaux[h][w] = atoi(last_token);
      }  
        
   }

                
        }

 }

    if( ferror(input_file) ){//limitation des erreurs d'ouverture de fichier 
    perror( "The following error occurred" );
    }
 fclose( input_file );
/*********initialisation du circuit****/
 if(0 != SDL_Init(SDL_INIT_EVERYTHING))
     {messageErreur();}
//creation de la fenetre
  SDL_Window *fenetre = SDL_CreateWindow("Fenetre de jeu",pos_x,pos_y,TAILLE_h,TAILLE_w, 0);
   if (fenetre==NULL)
   {messageErreur();}
//creation du rendu
   SDL_Renderer *renderer = SDL_CreateRenderer(fenetre, -1,0);
 if (renderer==NULL)
 {messageErreur();}

//creation du fond
   SDL_Texture *background = IMG_LoadTexture(renderer,fond);
   SDL_RenderCopy(renderer,background,NULL,NULL);
 SDL_RenderPresent(renderer);


 SDL_Rect rect ={pos_x,pos_y,TAILLE_h/taille_x,TAILLE_w/taille_y};
 SDL_Texture *circuit;

 for (d=0;d<taille_y;d++)
 {
  for(e=0;e<taille_x;e++)
  {
   r=carreaux[d][e];
   circuit =IMG_LoadTexture (renderer, zone[r].skin);
   SDL_RenderPresent(renderer);
   rect.x=rect.x+rect.w;
  }
  rect.x=0;
  rect.y=rect.y+rect.h;
 }

 
   SDL_Delay(7000);





//libération des elements(textures,rendu,fenetre,tableau,structures)
 SDL_DestroyTexture(circuit);
   SDL_DestroyTexture(background);
   SDL_DestroyRenderer(renderer);
   SDL_DestroyWindow(fenetre);

 free(carreaux);
 free(zone);

    }

    return 0;

}

1 réponse

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour, as-tu pu determiner à quelle ligne l'erreur se produisait?
0
Grunge_8666
 
Lignes 27 , 106, 146 et 292(sachant que l.292 n’existe pas )
0
Grunge_8666 > Grunge_8666
 
Apparemment j’ai des problèmes avec les fonctions atoi et strtol mais je ne comprends pas pourquoi
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Grunge_8666
 
tu as l'erreur à plusieurs lignes?

je constate que tu ne vérifies pas à chaque fois ce que retourne strtok.
0
Grunge_8666 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Je devrais printf la valeur de mon token à chaque fois du coup?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Grunge_8666 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
quelle documentation utilises-tu?
0