Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon programme se ferme tout seul

Dans le chp "Création d'une fenêtre et surfaces"

    17 avril 2006 à 21:57:29

    Salut,

    J'ai un problème au niveau de l'exercice du dégradé du chp "Création d'une fenêtre et de surfaces" dans la partie 3 du cours.

    En fait, j'ai recopié la fonction pause() comme l'avait dit Matéo, et plus tard, quand je pense avoir terminé mon code pour l'exercice du dégradé, je compile et exécute et... le programme s'ouvre et se ferme automatiquement, comme si j'avais oublié le pause().

    Quelqu'un a-t-il la solution à ce problème ?

    PS: j'ai bien vérifié avoir mis le prototype de la fonction pause() en haut. :)

    EDIT : Euh, je viens de mettre simplement ce code :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>

    void pause();

    int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);

        SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);

        pause();

        SDL_Quit();

        return EXIT_SUCCESS;
    }

    void pause()
    {
        int continuer = 1;
        SDL_Event event;

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }


    Bref, le code de base, et ça me fait toujours le même résultat ! Ca se ferme directement ! o_O Et toujours cette erreur que je ne comprends pas :

    Fatal signal: Segmentation Fault (SDL Parachute Deployed)
    • Partager sur Facebook
    • Partager sur Twitter
      17 avril 2006 à 22:06:06

      Le voilà ^^
      PS: je ne sais pas si il est bon, hein :p

      void pause();

      int main(int argc, char *argv[])
      {
          SDL_Surface *tableau[256] = {NULL};
          SDL_Surface *ecran = NULL;
          long i = 0;
          SDL_Rect position[256] = {0};
          for (i = 0 ; i < 256 ; i++)
          {
              position[i].x = 0;
              position[i].y = (480 / 256) + 1;
          }

          SDL_Init(SDL_INIT_VIDEO);

          ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
          tableau[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, 640, (480 / 256), 32, 0, 0, 0, 0);

          SDL_WM_SetCaption("Programme", NULL);

          for (i = 0 ; i < 256 ; i++)
          {
              Uint32 tableau = SDL_MapRGB(ecran->format, i, i, i);
              SDL_FillRect(tableau, NULL, SDL_MapRGB(ecran->format, i, i, i));
              SDL_BlitSurface(tableau, NULL, ecran, &position);
          }


          pause();

          SDL_FreeSurface(tableau[i]);
          SDL_Quit();

          return EXIT_SUCCESS;
      }

      void pause()
      {
          int continuer = 1;
          SDL_Event event;

          while (continuer)
          {
              SDL_WaitEvent(&event);
              switch(event.type)
              {
                  case SDL_QUIT:
                      continuer = 0;
              }
          }
      }
      • Partager sur Facebook
      • Partager sur Twitter
        17 avril 2006 à 22:26:34

        Uint32 tableau = SDL_MapRGB(ecran->format, i, i, i);
        SDL_FillRect(tableau, NULL, SDL_MapRGB(ecran->format, i, i, i));
        SDL_BlitSurface(tableau, NULL, ecran, &position);

        Tu devrais revoir les cours, puisque le premier arguement de SDL_FillRect doit etre une surface, meme chose pour SDL_BlitSurface, et le quatrième arguments de SDL_BlitSurface doit plustot etre &position[i]
        • Partager sur Facebook
        • Partager sur Twitter
          18 avril 2006 à 12:10:24

          Oui, mais même si l'erreur venait de là, ça serait pas quand même ça qui fermerait mon programme d'un coup, non ?

          PS: voici l'erreur qui s'affiche dans le fichier stderr.txt :

          Fatal signal: Segmentation Fault (SDL Parachute Deployed)
          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2006 à 20:52:15

            Bah j'ai tester chez moi et en mettant ces 3 ligne en commentaire le programme s'ouvrait.
            • Partager sur Facebook
            • Partager sur Twitter
              18 avril 2006 à 21:02:02

              Fatal signal: Segmentation Fault (SDL Parachute Deployed)

              Ce truc ça ne veut pas dire grand chose enfait... à chaque fois que j'ai un problème, même pour des truc apparement complettement diferent, j'obtiens ce même message...

              Bon sinon moi j'ai eu le même problème que toi, sur exactement le même exercice (le dégradé), ma fenetre s'ouvrais et se fermait toute seule, sans que je ne voye rien.
              Et personne, sur ce site, n'a pu résoudre le probleme!! :colere:

              Enfait maintenant j'ai compris: j'avait fait une fonction dédié à cette ligne:
              ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);

              Des que je remetais cette ligne dans le main, c'etait bon, et des que je la remetais dans une fonction à part, ça me refesais l'erreur.... C'est con mais bon, tant pis...
              • Partager sur Facebook
              • Partager sur Twitter
                18 avril 2006 à 21:27:13

                tableau[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, 640, (480 / 256), 32, 0, 0, 0, 0);


                Juste comme ça ton tableau[i] est en dehors d'une boucle, alors ton i veut pas trop dire quelque chose à moins que tu aies besoin de i = 255 (à la fin de ta boucle il vut ça), mais dans ce cas c'est plus simple de marquer tableau[255] !
                • Partager sur Facebook
                • Partager sur Twitter
                  21 avril 2006 à 19:23:24

                  Voila ton code corrigé avec les commentaires de correction, ce sont des erreurs bêtes mais sache que pour un dégradé chaque ligne doit changée d'où le tableau et les boucles :


                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <SDL/SDL.h>

                  void pause();

                  int main(int argc, char *argv[])
                  {
                      SDL_Surface *tableau[256] = {NULL};
                      SDL_Surface *ecran = NULL;
                      long i = 0;
                      SDL_Rect position[256] = {0};
                      for (i = 0 ; i < 256 ; i++)
                      {
                          position[i].x = 0;
                          position[i].y = i + 1;// Pour le dégradé il faut que le pixel de la position change a chaque fois !
                      }

                      SDL_Init(SDL_INIT_VIDEO);

                      ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);// L'ecran est trop grand, il y aura du noir en bas de la fenetre
                      for (i = 0 ; i < 256 ; i++)// Tu oublie la boucle !
                      {
                      //Chaque element du tableau tableau doit changé à chaque fois pour que chaque ligne change !!!
                      tableau[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, 640, (480 / 256), 32, 0, 0, 0, 0);
                      }
                      SDL_WM_SetCaption("Programme", NULL);

                      for (i = 0 ; i < 256 ; i++)
                      {
                          //Chaque element du tableau tableau doit changé à chaque fois pour le dégradé
                          SDL_FillRect(tableau[i], NULL, SDL_MapRGB(ecran->format, i, i, i));
                          //Chaque element du tableau tableau doit changé à chaque fois pour le dégradé et la position change à chaque fois
                          SDL_BlitSurface(tableau[i], NULL, ecran, &position[i]);
                      }


                      pause();

                      SDL_FreeSurface(tableau[i]);
                      SDL_Quit();

                      return EXIT_SUCCESS;
                  }

                  void pause()
                  {
                      int continuer = 1;
                      SDL_Event event;

                      while (continuer)
                      {
                          SDL_WaitEvent(&event);
                          switch(event.type)
                          {
                              case SDL_QUIT:
                                  continuer = 0;
                          }
                      }
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 avril 2006 à 10:03:14

                    Juste histoire d'apporter une petite précision qui peut aider par la suite :

                    "Fatal signal: Segmentation Fault (SDL Parachute Deployed)" : Il me semble que cette erreur est due à un problème avec la RAM (l'histoire des adresses à réserver et autre).


                    Elle est souvent due à des variables SDL_Surface qui n'ont pas été déclarées mais utilisées par la suite, ou des étapes sautées lors de la création d'une surface.
                    Dans le premier code que tu as donné, par exemple, tu avais oublié de déclarer la surface "ecran" pour ensuite mettre "ecran = SDL_SetVideoMode(...);" et non simplement "SDL_SetVideoMode(...);".
                    C'est ce que je pense en tout cas...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 avril 2006 à 10:36:59

                      Exactement.

                      De plus, dire que les messages de Segmentation Fault ne signifient rien est faux. Au contraire, c'est on ne peut plus clair.

                      Comme l'a dir <Romuald>, c'est "un problème avec la RAM" : le message signifie simplement un débordement de mémoire, soit que le programme a essayé d'accéder à une zone de mémoire non-allouée.

                      Cela peut donc venir de plusieurs faits, et c'est pour cela qu'il peut apparaître pour "des trucs apparement différents". Les plus courants sont les allocations de mémoires deffectueuses et la tentative d'accès à la case d'un tableau ou d'une chaine qui n'existe pas.
                      (exemple : s[strlen(s)+ 2])

                      Les segmentations fault sont des erreurs comme les autres, et sont souvent annoncés par des warnings.

                      ++.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Mon programme se ferme tout seul

                      × 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