Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec SDL

    22 février 2020 à 15:19:09

    Bonjour,

    Souhaitant créer un menu SDL pour mon jeu, je me suis dis que le faire avec des fonctions qui ont chacune une tâche serait bien plus propre que tout ranger dans le main.

    Le truc, c'est quand j'exécute j'ai une erreur de segmentation (je suis sous Linux). J'ai check le breakpoint avec gdb et le problème vient de 'SDL_FreeSurface'.

    Mon main :

    #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;
    }
    

    Menu.h :

    #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
    
    

    Menu.c :

    #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;
    }
    

    J'ai essayé de mettre

    SDL_FreeSurface(m->background);

    dans la fonction afficherMenu, ce qui a marché, mais impossible de fermer le programme (j'ai du faire un kill) et le background ne s'affiche pas.

    De l'aide ? 

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2020 à 15:28:41

      Hello,

      Écrire menu m ou menu k n'initialise pas les membres de la structure. Donc, m->continuer a une valeur indéfinie en ligne 46, de même que tous les membre de k dans la fonction updateMenu() (sauf etat). N'aurais-tu pas oublié d'appeler initialiser() :p ?

      À part ça, ça me semble confus comme organisation.

      -
      Edité par edgarjacobs 22 février 2020 à 15:41:07

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        22 février 2020 à 15:34:00

        edgarjacobs a écrit:

        Hello,

        Écrire menu m ou menu k n'initialise pas les membres de la structure. Donc, m->continuer a une valeur indéfinie en ligne 46, de même que k->background en lignes 27 et 39 (par exemple). N'aurais-tu pas oublier d'appeler initialiser() ?

        -
        Edité par edgarjacobs il y a moins de 30s


        Salut,

        J'ai écris menu k car sinon il y'aurait un 'conflicting type' quand je fais l'appel de updateMenu dans afficherMenu (selon le compilateur). Sinon, j'ai essayé d'appeler initaliser dans le main mais toujours rien, segmentation fault quand j'exécute. 

        Merci de ta réponse.

        • Partager sur Facebook
        • Partager sur Twitter
          22 février 2020 à 15:46:21

          Re,-

          Je ne comprends pas vraiment ce que tu veux faire, mais tu as sans doute mal compris la partie pointeur du C (et elle est vitale). Si tu avais écrit, ligne 48, updateMenu(m), tu n'aurais pas eu d'erreur (de compilation)

          Edit: j'ai modifié mon 1er post alors que tu écrivais.

          -
          Edité par edgarjacobs 22 février 2020 à 15:48:18

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            22 février 2020 à 15:58:53

            edgarjacobs a écrit:

            Re,-

            Je ne comprends pas vraiment ce que tu veux faire, mais tu as sans doute mal compris la partie pointeur du C (et elle est vitale). Si tu avais écrit, ligne 48, updateMenu(m), tu n'aurais pas eu d'erreur (de compilation)

            Edit: j'ai modifié mon 1er post alors que tu écrivais.

            -
            Edité par edgarjacobs il y a 5 minutes


            D'accord, merci. Sinon, t'as une idée d'organisation ? Je comprends pas trop en quoi l'organisation est confue

            • Partager sur Facebook
            • Partager sur Twitter
              22 février 2020 à 16:11:35

              Exemple bref
              int menu(....) {
              	initializeMenu();
              	dislayMenu();
              	rc=treatMenu();
              	expungeMenu();
              
              	return(rc);
              }
              
              
              int main(....) {
              	initialize();
              	switch(menu()) {
              		case 1:
              			fct1();
              			break;
              		case ....:
              			fct....();
              			break;
              		default:
              			break;
              	}
              	expunge();
              	
              	return(0);
              }
              

              -
              Edité par edgarjacobs 22 février 2020 à 16:18:37

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              Problème avec SDL

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown