Erreur de segmentation [ C / MYSQL /SDL ]
grollum
Messages postés
44
Date d'inscription
Statut
Membre
Dernière intervention
-
grollum Messages postés 44 Date d'inscription Statut Membre Dernière intervention -
grollum Messages postés 44 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Je conçois un programme en C avec les bibliothèques SDL et MYSQL :
main.c
joueur.h
joueur.c
Ma fenêtre n'apparait que quelque secondes, le bug est probablement au moment de l'appel de la fonction.
Mon compilateur ne m'affiche aucune erreur, mais mon debugger me signale une erreur de segmentation ! Je ne parviens pas à trouver où elle se situe.
Si l'un de vous à la réponse, je le prie de me la communiquer... merci d'avance.
Je conçois un programme en C avec les bibliothèques SDL et MYSQL :
main.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock.h> #include <MYSQL/mysql.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include "BDD.h" #include "joueur.h" int SDL_main(int argc, char* argv[]) { SDL_Surface *ecran = NULL, *perso1 = NULL; SDL_Rect position_perso1; SDL_Event event; int continuer, i; long nb_joueurs; MYSQL mysql; Joueur *joueurs[100]; mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option"); mysql_real_connect(&mysql,"hebergeur","pseudo","mot de passe,"BDD",0,NULL,0); SDL_Init(SDL_INIT_VIDEO); ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_WM_SetCaption("P0goWOrlD !", NULL); perso1 = IMG_Load("perso_B.PNG"); nb_joueurs = initialiser_joueur(joueurs, &mysql); position_perso1.x = 210; position_perso1.y = 150; SDL_EnableKeyRepeat(15, 25); 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: // Flèche haut position_perso1.y -= 6; perso1 = IMG_Load("perso_H.PNG"); break; case SDLK_DOWN: // Flèche bas position_perso1.y += 6; perso1 = IMG_Load("perso_B.PNG"); break; case SDLK_RIGHT: // Flèche droite position_perso1.x += 6; perso1 = IMG_Load("perso_D.PNG"); break; case SDLK_LEFT: // Flèche gauche position_perso1.x -= 6; perso1 = IMG_Load("perso_G.PNG"); break; } } SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 0, 0)); SDL_SetColorKey(perso1, SDL_SRCCOLORKEY, SDL_MapRGB(perso1->format, 255, 255, 255)); SDL_BlitSurface(perso1, NULL, ecran, &position_perso1); for ( i = 0; nb_joueurs >= 1; i++ ) { SDL_BlitSurface(joueurs[i]->perso, NULL, ecran, &joueurs[i]->position_perso); } SDL_Flip(ecran); } //Fin de la SDL SDL_FreeSurface(perso1); for ( i = 0; nb_joueurs >= 1; i++ ) { SDL_FreeSurface(joueurs[i]->perso); } SDL_Quit(); mysql_close(&mysql); ShellExecute(NULL, NULL, "http://www.pogoworld.4yu.fr/", NULL, NULL, SW_SHOWNORMAL); return EXIT_SUCCESS; }
joueur.h
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock.h> #include <MYSQL/mysql.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> typedef struct Joueur Joueur; struct Joueur { char pseudo[155]; long apparence[3]; long taille; SDL_Surface *perso; SDL_Rect position_perso; }; long initialiser_joueur(Joueur *joueurs[], MYSQL *mysql);
joueur.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock.h> #include <MYSQL/mysql.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include "joueur.h" long initialiser_joueur(Joueur *joueurs[], MYSQL *mysql) { int i; /////////////////////APPARENCE//////////////////////// mysql_query(mysql, "SELECT apparence FROM joueur"); MYSQL_RES *result_apparence = NULL; MYSQL_ROW row_apparence = NULL; long apparence_perso[100]; result_apparence = mysql_use_result(mysql); while ((row_apparence = mysql_fetch_row(result_apparence))) { apparence_perso[i] = atoi(row_apparence[i]); joueurs[i]->apparence[0] = apparence_perso[i]; apparence_perso[i] ++; joueurs[i]->apparence[1] = apparence_perso[i]; apparence_perso[i] += 2; joueurs[i]->apparence[2] = apparence_perso[i]; apparence_perso[i] += 3; joueurs[i]->apparence[3] = apparence_perso[i]; i++; } i = 0; /////////////////////////TAILLE////////////////////////// mysql_query(mysql, "SELECT taille FROM joueur"); MYSQL_RES *result_taille = NULL; MYSQL_ROW row_taille = NULL; long taille[100]; result_taille = mysql_use_result(mysql); while ((row_taille = mysql_fetch_row(result_taille))) { taille[i] = atoi(row_taille[i]); joueurs[i]->taille = taille[i]; i++; } i++; /////////////////////////SURFACE////////////////////////////// int j; for ( j = 0; i >= j; j++ ) { char png[] = ".PNG"; char apparence0[150]; sprintf(apparence0,"%d",&joueurs[j]->apparence[0]); strcat(apparence0, png); joueurs[j]->perso = IMG_Load(apparence0); } /////////////////////////COORDONNEE X////////////////////////// mysql_query(mysql, "SELECT x FROM joueur"); MYSQL_RES *result_x = NULL; MYSQL_ROW row_x = NULL; i = 0; unsigned int num_champs_x = 0; result_x = mysql_use_result(mysql); num_champs_x = mysql_num_fields(result_x); while ((row_x = mysql_fetch_row(result_x))) { unsigned long *lengths_x; lengths_x = mysql_fetch_lengths(result_x); for(i = 0; i < num_champs_x; i++) { joueurs[i]->position_perso.x = atoi(row_x[i]); } } ///////////////////COORDONNEE Y///////////////////// mysql_query(mysql, "SELECT y FROM joueur"); MYSQL_RES *result_y = NULL; MYSQL_ROW row_y = NULL; i = 0; unsigned int num_champs_y = 0; result_y = mysql_use_result(mysql); num_champs_y = mysql_num_fields(result_y); while ((row_y = mysql_fetch_row(result_y))) { unsigned long *lengths_y; lengths_y = mysql_fetch_lengths(result_y); for(i = 0; i < num_champs_y; i++) { joueurs[i]->position_perso.y = atoi(row_y[i]); } } mysql_free_result(result_apparence); mysql_free_result(result_taille); mysql_free_result(result_x); mysql_free_result(result_y); i++; long nb_joueurs = i; return nb_joueurs; }
Ma fenêtre n'apparait que quelque secondes, le bug est probablement au moment de l'appel de la fonction.
Mon compilateur ne m'affiche aucune erreur, mais mon debugger me signale une erreur de segmentation ! Je ne parviens pas à trouver où elle se situe.
Si l'un de vous à la réponse, je le prie de me la communiquer... merci d'avance.
A voir également:
- Erreur de segmentation [ C / MYSQL /SDL ]
- Mysql community server - Télécharger - Bases de données
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
1 réponse
Bonjour,
T'aider sur un programme comme celui-ci n'est pas aisé. Je n'ai ni la SDL ni le mySQL sur mon PC. Si tu as un debuggueur tu devrais facilement trouver la ligne. Segmentation fault c'est un accès non autorisé à la mémoire. Cela peut être un dépassement de tableau comme un accès direct. (l'adresse NULL par exemple) Sans debuggueur... il reste la solution du pauvre, les printf pour voir jusqu'où s'exécute le programme avant de planter.
Bon courage.
M.
T'aider sur un programme comme celui-ci n'est pas aisé. Je n'ai ni la SDL ni le mySQL sur mon PC. Si tu as un debuggueur tu devrais facilement trouver la ligne. Segmentation fault c'est un accès non autorisé à la mémoire. Cela peut être un dépassement de tableau comme un accès direct. (l'adresse NULL par exemple) Sans debuggueur... il reste la solution du pauvre, les printf pour voir jusqu'où s'exécute le programme avant de planter.
Bon courage.
M.
Je vais comme tu me l'as conseiller me servir des printf car je ne sais pas très bien faire parler mon debuggeur ^^.