Probleme: erreur de segmentation

Fermé
Grunge_8666 Messages postés 2 Date d'inscription dimanche 13 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020 - Modifié le 14 déc. 2020 à 00:00
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 15 déc. 2020 à 11:09
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
14 déc. 2020 à 11:52
bonjour, as-tu pu determiner à quelle ligne l'erreur se produisait?
0
Lignes 27 , 106, 146 et 292(sachant que l.292 n’existe pas )
0
Grunge_8666 > Grunge_8666
14 déc. 2020 à 12:58
Apparemment j’ai des problèmes avec les fonctions atoi et strtol mais je ne comprends pas pourquoi
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Grunge_8666
14 déc. 2020 à 13:25
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 dimanche 13 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
15 déc. 2020 à 07:37
Je devrais printf la valeur de mon token à chaque fois du coup?
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Grunge_8666 Messages postés 2 Date d'inscription dimanche 13 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020
15 déc. 2020 à 11:09
quelle documentation utilises-tu?
0