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 -
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:
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?
je constate que tu ne vérifies pas à chaque fois ce que retourne strtok.