Erreur de segmentation [ C / MYSQL /SDL ]
grollum
Messages postés
44
Statut
Membre
-
grollum Messages postés 44 Statut Membre -
grollum Messages postés 44 Statut Membre -
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 de lecture reconnecté en 3s - Forum TV & Vidéo
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
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 ^^.