IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Segmentation fault que j'arrive pas à trouver


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Segmentation fault que j'arrive pas à trouver
    Bonjour,

    Dans le but de coder un jeu en C avec SDL 1.2, j'ai décidé de commencer par développer un menu. Le truc, c'est que je voulais faire plusieurs fonctions afin d'avoir un code 'optimal' et pratique.
    Mais quand je lance, j'ai un seg fault. J'ai effectué un breakpoint avec gdb :

    0x00007ffff7b6b5f5 in SDL_FreeSurface()
    Il y'a bien un problème avec SDL_FreeSurface() mais je comprends toujours pas où est le problème, même en relisant mon code plusieurs fois.

    Mon main.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h> 
    #include <SDL/SDL_ttf.h>
    #include "menu.h"
     
    int main(int argc, char *argv[])
    {
    	menu m;
     
    	SDL_Init(SDL_INIT_VIDEO);
     
    	m.screen = SDL_SetVideoMode(1280,960,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
     
    	afficherMenu(&m);
     
            SDL_Quit();
     
    	return 0;
    }
    Mon menu.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h> 
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_mixer.h>
    #include "menu.h"
     
    void initialiser(menu *m)
    {
    	(m->screen)=NULL; 
    	(m->background)=IMG_Load("bg.jpg");
    	(m->continuer)=1;
    }
     
    void updateMenu(menu *k)
    {	
    	(k->etat)=1;
     
    	SDL_Event event;
     
    	SDL_PollEvent(&event);
     
    		switch(k->etat)
    		{
    			case 1:
    				SDL_BlitSurface(k->background,NULL,k->screen,NULL);
    				SDL_Flip(k->screen);
     
    				switch(event.type)
    				{
    					case SDL_QUIT:
    					k->continuer=0;
    					break;
    				}
    			break;
    		}
     
    	SDL_FreeSurface(k->background);
    }
     
    unsigned int afficherMenu(menu *m)
    {
    	menu k;
     
    	while(m->continuer)
    	{
    		updateMenu(&k);
    	}
     
    	return 1;
    }
    et mon menu.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #ifndef MENU_H_INCLUDED
    #define MENU_H_INCLUDED
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h> 
    #include <SDL/SDL_ttf.h>
     
    typedef struct
    {
    	SDL_Surface *screen;
    	SDL_Surface *background;
     
    	int etat,continuer;
    }menu;
     
    void initialiser(menu *m);
    void updateMenu(menu *k);
    unsigned int afficherMenu(menu *m);
     
    #endif
    Quelqu'un peut m'aider ?
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Alors quelque truc qui me gêne :
    -c'est inutile de faire plein de parenthèse genre : (m->continuer)=1; , c'est vraiment infâme comme truc
    -éviter les noms de variables du type k et m.
    -pour les structures il est conseillé de mettre une majuscule , genre menu -> Menu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDL_BlitSurface(k->background,NULL,k->screen,NULL);
    				SDL_Flip(k->screen);
    Le flip doit se faire une seule fois par frame , il ne doit pas y'avoir une ou des conditions qui doit faire le flip , deja un ça évite le clignotement et deux il faut "logiquement" toujours afficher un truc.

    Pour ton erreur , ça doit venir de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (m->background)=IMG_Load("bg.jpg");
    A mon avis bg.jpg n'est pas chargé (d'où pourquoi il faut toujours vérifier si le chargement c'est bien passer).

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 97
    Points : 247
    Points
    247
    Par défaut
    hi, aussi dans la fonction "updateMenu(menu *k)" il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FreeSurface(k->background);
    Or on utilise la freesurface lorsque la surface ne doit plus être utilisé, dans ton cas "updateMenu(menu *k)" est exécuté en boucle, donc dès la fin de la 1ere frame le k->background devient vide.

    Sinon, je vois pas l'utilisation de la fonction "initialiser(menu *m)" dans ta fonction main pour renforcé le point de vue de Kannagi.

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    Dans la fonction afficherMenu(menu *m), il y a une variable de type menu déclarée
    Donc elle a une certaine portée mais n'est pas allouée dans d'autres parties donc il faut la déclarer en globale et l'allouer par malloc.
    Cependant il est souhaitable de faire des classes C++ et des singletons c'est vraiment plus modulable

Discussions similaires

  1. Segment fault que je ne comprend pas.
    Par Code Rom dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 26/03/2018, 10h46
  2. Erreur de syntaxe que je n'arrive pas à trouver
    Par pierrot10 dans le forum Langage
    Réponses: 3
    Dernier message: 12/07/2008, 00h28
  3. [Tableaux] probleme je n'arrive pas à trouver l'erreur
    Par harlock59 dans le forum Langage
    Réponses: 21
    Dernier message: 06/06/2006, 14h43
  4. Réponses: 5
    Dernier message: 14/05/2006, 22h41
  5. Une parse error que j'arrive pas à trouver
    Par Kerweb dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2006, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo