Erreur de segmentation [ C / MYSQL /SDL ]

Fermé
grollum Messages postés 44 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 février 2009 - 25 mars 2008 à 20:31
grollum Messages postés 44 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 février 2009 - 25 mars 2008 à 22:12
Bonjour à tous,
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:

1 réponse

Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
25 mars 2008 à 22:08
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.
0
grollum Messages postés 44 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 février 2009
25 mars 2008 à 22:12
Merci de ta réponse Mahmah,
Je vais comme tu me l'as conseiller me servir des printf car je ne sais pas très bien faire parler mon debuggeur ^^.
0