Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de placement d'une fonction

en fonction du .cpp ou elle se trouve

    4 mai 2008 à 23:54:00

    Bonjour à tous, j'ai un sacré drôle de problème. J'ai actuellement une fonction gestionBoiteDialogue() :

    int gestionBoiteDialogue(SDL_Surface*&screen, char*titre ,char *question, ...)
    {
        int choixUtilisateur=0;
        va_list listeArg;
        va_start(listeArg, question);
        char *choixActuel;
        char *listeChoix[NB_REPONSE_MAX];
        int nbChoix=0;
        SDL_Surface * SurfQuestion = NULL;
        SDL_Surface * SurfTitre = NULL;
        SDL_Surface * bouton[NB_REPONSE_MAX*2]={NULL};
        SDL_Surface * tmpsScreen = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH, HEIGHT, 32, 0, 0, 0, 0);
        
        SDL_Rect RectTmps;
        RectTmps.x=0;
        RectTmps.y=0;
        SDL_BlitSurface(screen,NULL, tmpsScreen,&RectTmps);
        
        SDL_Surface * croix[2];
        croix[0] = IMG_Load("Data/Picture/EditeurMap/croix.png");
        croix[1] = IMG_Load("Data/Picture/EditeurMap/croixActif.png");
        Coordonnee souris;
        Coordonnee boiteDialogue;
        
        FILE *erreur = fopen("Data/erreur.txt","a");
        if(croix[0] == NULL)
        {
                 fprintf(erreur, "Problème de chargement de l'image Data/Picture/EditeurMap/croix.png");
                 exit(EXIT_FAILURE);
        }
        if(croix[1] == NULL)
        {
                 fprintf(erreur, "Problème de chargement de l'image Data/Picture/EditeurMap/croixActif.png");
                 exit(EXIT_FAILURE);
        }
        
       
        for(int y=0; y<NB_REPONSE_MAX; y++)
            bouton[y] = IMG_Load("Data/Picture/EditeurMap/boutonSombre.png");
        for(int y=NB_REPONSE_MAX; y<NB_REPONSE_MAX*2;y++)
            bouton[y] = IMG_Load("Data/Picture/EditeurMap/boutonSombreActif.png");
        
        for(int y=0; y<NB_REPONSE_MAX; y++)
        {
                if(bouton[y] == NULL)
                {
                     fprintf(erreur, "Problème de chargement de l'image Data/Picture/EditeurMap/boutonSombre.png\n");
                     exit(EXIT_FAILURE);
                }
                if(bouton[NB_REPONSE_MAX+y] == NULL)
                {
                     fprintf(erreur, "Problème de chargement de l'image Data/Picture/EditeurMap/boutonSombreActif.png\n");
                     exit(EXIT_FAILURE);
                }
        }
        
         char cheminPolice[64];
         sprintf(cheminPolice, "Data/Police/%s", POLICE);
         TTF_Font *police = TTF_OpenFont(cheminPolice, TAILLE_POLICE); 
         if(police == NULL)
         {
                 fprintf(erreur, "Problème de chargement de %s pour l'ecriture des bouttons", cheminPolice);
                 exit(EXIT_FAILURE);
         }
         SDL_Color colorTexte={COULEUR_R_TEXTE,COULEUR_G_TEXTE,COULEUR_B_TEXTE};
         SDL_Color colorTitre={255,255,255};
         SDL_Surface*tmps=NULL;
         SDL_Rect Rect;
         
         SurfQuestion = TTF_RenderText_Blended(police, question, colorTexte);
         SurfTitre = TTF_RenderText_Blended(police, titre, colorTitre);
        
        while((choixActuel = va_arg(listeArg,  char*)) != "\0")
        {
               tmps = TTF_RenderText_Blended(police, choixActuel, colorTexte);
               if(tmps == NULL)
               {
                     fprintf(erreur, "Problème d'écriture des choix de réponse : %s\n", choixActuel);
                     exit(EXIT_FAILURE);
               }
               else
               {
                   Rect.x = bouton[0]->w/2 - tmps->w/2;
                   Rect.y = bouton[0]->h/2 - tmps->h/2;
                   SDL_BlitSurface(tmps,NULL,bouton[nbChoix],&Rect);
                   SDL_BlitSurface(tmps,NULL,bouton[nbChoix+NB_REPONSE_MAX],&Rect);
                   nbChoix++;
               }
        }
        Coordonnee tailleFenetre;
        
        tailleFenetre.x = 200 + bouton[0]->w*(nbChoix) + 50*(nbChoix-1);
           
        tailleFenetre.y = bouton[0]->h + SurfQuestion->h + SurfTitre->h + 50;
        
        SDL_Surface * arrierePlan[2] = {NULL};  
        arrierePlan[0]=SDL_CreateRGBSurface(SDL_HWSURFACE, tailleFenetre.x, tailleFenetre.y, 32, 0, 0, 0, 0);
        SDL_FillRect(arrierePlan[0], NULL, SDL_MapRGB(screen->format, 50, 50, 50));
    
        arrierePlan[1]=SDL_CreateRGBSurface(SDL_HWSURFACE, tailleFenetre.x-2, tailleFenetre.y-(SurfTitre->h+10), 32, 0, 0, 0, 0);
        SDL_FillRect(arrierePlan[1], NULL, SDL_MapRGB(screen->format, 100, 100, 100));
    
        
        boiteDialogue.x = WIDTH/2 - arrierePlan[0]->w/2;
        boiteDialogue.y = HEIGHT/2 - arrierePlan[0]->h/2;
        
           
        SDL_Event event;
        bool continuer=true;
        afficherBoiteDialogue(tmpsScreen, screen, SurfQuestion, SurfTitre, bouton, croix, arrierePlan, souris, boiteDialogue, choixUtilisateur, nbChoix);     
        while(continuer)
        {
             SDL_WaitEvent(&event);
                  switch(event.type)
                  {
                      case SDL_QUIT:
                          exit(EXIT_SUCCESS);
                      case SDL_KEYDOWN:
                        switch(event.key.keysym.sym)
                        {
                              case SDLK_RETURN:
                                   continuer = false;
                                   break;       
                              case SDLK_RIGHT:
                                   choixUtilisateur ++;
                                   if(choixUtilisateur == nbChoix)
                                       choixUtilisateur = nbChoix-1;
                                   break;
                              case SDLK_LEFT:
                                   choixUtilisateur --;         
                                   if(choixUtilisateur < 0)
                                       choixUtilisateur = 0;
                                   break;   
                              case SDLK_ESCAPE:
                                   choixUtilisateur = nbChoix;
                                   continuer = false;
                                   break;    
                        }
                        break;
                      case SDL_MOUSEMOTION :
                                 souris.x = event.motion.x;
                                 souris.y = event.motion.y;
                      break;
                      case SDL_MOUSEBUTTONDOWN:
                           if(souris.x > boiteDialogue.x + arrierePlan[0]->w - croix[0]->w && souris.x < boiteDialogue.x + arrierePlan[0]->w
                           && souris.y > boiteDialogue.y && souris.y < boiteDialogue.y + croix[0]->h)
                           {
                                 choixUtilisateur = nbChoix;
                                 continuer = false;      
                           }
                           for(int j=0; j<nbChoix; j++)
                               if(souris.x > boiteDialogue.x + 100 + (bouton[0]->w+50)*j && souris.x < boiteDialogue.x + 100 + (bouton[0]->w+50)*j+bouton[0]->w
                               && souris.y > boiteDialogue.y+arrierePlan[0]->h-arrierePlan[1]->h+SurfQuestion->h +30 && souris.y < boiteDialogue.y+arrierePlan[0]->h-arrierePlan[1]->h+SurfQuestion->h + 30 + bouton[0]->h)
                               {
                                           choixUtilisateur = j;
                                           continuer = false;
                               }    
                      break;
                           
                  } 
                  
                  for(int j=0; j<nbChoix; j++)
                          if(souris.x > boiteDialogue.x + 100 + (bouton[0]->w+50)*j && souris.x < boiteDialogue.x + 100 + (bouton[0]->w+50)*j+bouton[0]->w
                          && souris.y > boiteDialogue.y+arrierePlan[0]->h-arrierePlan[1]->h+SurfQuestion->h +30 && souris.y < boiteDialogue.y+arrierePlan[0]->h-arrierePlan[1]->h+SurfQuestion->h + 30 + bouton[0]->h)
                               choixUtilisateur = j;
    
                  afficherBoiteDialogue(tmpsScreen, screen, SurfQuestion, SurfTitre, bouton, croix, arrierePlan, souris, boiteDialogue, choixUtilisateur, nbChoix);     
        }
        
        SDL_BlitSurface(tmpsScreen,NULL, screen,&RectTmps);
        
        fclose(erreur);
        SDL_FreeSurface(SurfQuestion);
        SDL_FreeSurface(SurfTitre);
        SDL_FreeSurface(tmpsScreen);
        SDL_FreeSurface(croix[0]);
        SDL_FreeSurface(croix[1]);
        for(int y=0; y<NB_REPONSE_MAX*2; y++)
            SDL_FreeSurface(bouton[y]);   
        
        return choixUtilisateur;   
    }
    


    Le problème est qu'elle se trouve dans le même .cpp que la fonction ou je l'apelle :
    void supprimerMap(char listeMap[], char sauvName[], SDL_Surface * screen)
    {
          char question[64];
          sprintf(question, "Etes vous sur de vouloir supprimer %s ?",listeMap);
          int choixUtilisateur = gestionBoiteDialogue(screen,"Suppression", question,"Oui","Non","\0");
          if(choixUtilisateur == 0)
          {
                sprintf(question, "%s a bien ete supprimer",listeMap);
                gestionBoiteDialogue(screen,"Suppression", question,"Ok","\0");
          }
    }
    


    Maintenant j'aimerai mettre la fonction dans general.cpp, je crée donc general.cpp et general.h, je met le prototype dans le .h et la fonction dans le .cpp, j'inclus le .h dans tous les .h et là au moment ou le programme ouvre la fonction, il se ferme brutalement...

    A savoir :

    constante.cpp


    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    
    #include <dirent.h>
    #include <stdarg.h>
    
    
    //***** permet d'utiliser le mode console avc SDL *****//
    #ifdef main   
    #undef main
    #endif 
    //****************************************************//
    
    
    using namespace std;
    
    #define WIDTH   1024
    #define HEIGHT   768
    
    #define VERSION  "0.1b"
    
    void Init(SDL_Surface * &screen);
    
    
    
    
    
    /*********************************** ENUM ***************************************/
    
    typedef struct Coordonnee Coordonnee;
    struct Coordonnee
    {
           int x;
           int y;
    };
    
    
    /***** MAPPING *****/
    
    #define TAILLE_TABLEAU      256
    #define TAILLE_FRAME         50
    
    /***** INFORMATION MAPPING *****/
    
    #define TAILLE_MIN           15
    #define TAILLE_MAX          250
    
    #define COULEUR_R_TEXTE       0
    #define COULEUR_G_TEXTE       0
    #define COULEUR_B_TEXTE       0
    
    #define POLICE         "ank.ttf"
    #define TAILLE_POLICE        20
    
    #define NB_MAP_MAX          250
    #define TAILLE_NOM_MAP       63
    
    #define NB_NOM_AFFICHER      15
    
    #define NB_REPONSE_MAX        4
    


    voilà j'espère en avoir assez dit pour que vous arriviez à m'aider...

    Merci d'avance à tous et à toutes (on sait jamais)
    • Partager sur Facebook
    • Partager sur Twitter
      5 mai 2008 à 10:35:40

      Est ce que tu pourais faire tourner le programme dans un debugger et nous dire:
      - Quels sont les arguments que tu as passé a ta boite de dialogue
      - A quelle ligne ca plante?

      Sinon il y a un fichier stderr généré par la SDL. Qu'est ce qu'il contient?
      • Partager sur Facebook
      • Partager sur Twitter
        5 mai 2008 à 12:24:18

        les arguments c'est ceux dans la fonction supprimerMap() soit :
        int choixUtilisateur = gestionBoiteDialogue(screen,"Suppression", question,"Oui","Non","\0");
        


        Le problème es que je n'arrive pas à trouver la partie qui bogue. Lorsque j'utilise le debug le programme se compile normalement et quand j'ouvre la fonction il se ferme comme si je l'avais compiler normalement. Et j'ai pas plus d'information avec le debug..

        Pour stderr il se trouve ou ?
        • Partager sur Facebook
        • Partager sur Twitter
          5 mai 2008 à 13:04:41

          stderr il se trouve a l'endroit ou il y a ton exécutable.
          pour les arguments je te demande les valeurs : fais un printf ou un cout, ca te permettra de verrifier que screen n'est pas nul par exemple, ou que tu utilises bien l'élipse (...)

          Ensuite sans passer par un debugger, je ne saurais pas trouver l'erreur en lisant le code.
          • Partager sur Facebook
          • Partager sur Twitter
            5 mai 2008 à 13:45:48

            pour stderr c'est ce que je pensais, donc je peux répondre sans me tromper qu'il n'existe pas chez moi.

            Pour ce qui concerne des arguments, ils ne sont pas nul.

            Pour le debugger je dois faire comment pour le faire fonctionner ?
            • Partager sur Facebook
            • Partager sur Twitter
              6 mai 2008 à 15:47:46

              Pour le debugger je ne sais pas trop.

              Pour tester ta fonction : tu peux déjà regarder si elle est appelée en faisant un std::cout , et si elle arrive jusqu'à la fin avec un autre std::cout. SDL va écrire dans stdout.txt.
              Si t'as rien ou pas de stdout.txt c'est que ta fonction n'est pas appelée.
              • Partager sur Facebook
              • Partager sur Twitter

              Problème de placement d'une fonction

              × 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