Grunge_8666
Messages postés2Date d'inscriptiondimanche 13 décembre 2020StatutMembreDernière intervention15 décembre 2020
-
Modifié le 14 déc. 2020 à 00:00
yg_be
Messages postés23405Date d'inscriptionlundi 9 juin 2008StatutContributeurDernière intervention20 décembre 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;
}
14 déc. 2020 à 12:57
14 déc. 2020 à 12:58
14 déc. 2020 à 13:25
je constate que tu ne vérifies pas à chaque fois ce que retourne strtok.
15 déc. 2020 à 07:37
15 déc. 2020 à 11:09