Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme en C avec SDL et DevC++ qui plante !

    15 février 2017 à 20:53:00

    Bonjour

    Je voulais faire un programme de test simple en C avec SDL 1.2, et il plante :
    - Au bout de quelques secondes de fonctionnement.
    - Quand on clique dans la fenêtre.
    - Quand on appuie une touche du clavier.

    Voilà mon code :

    #include <SDL/SDL.h>
    
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL ;
        SDL_Surface *objet = NULL ;
        SDL_Rect pos ;
        
        SDL_Init (SDL_INIT_VIDEO) ;
        ecran = SDL_SetVideoMode (320, 240, 32, SDL_SWSURFACE) ;
        objet = SDL_LoadBMP("objet.bmp") ;
    
        
        ///////////////////////////////// Programme :
        
        while (1)
        {
            SDL_FillRect(ecran, NULL, SDL_MapRGB (ecran->format, 127, 0, 255));
            pos.x = 120 ;
            pos.y = 120 ;
            SDL_BlitSurface (objet, NULL, ecran, &pos) ;
            SDL_Flip (ecran);
            SDL_Delay (200) ;
            
            SDL_FillRect(ecran, NULL, SDL_MapRGB (ecran->format, 127, 0, 255));
            pos.x = 20 ;
            pos.y = 20 ;
            SDL_BlitSurface (objet, NULL, ecran, &pos) ;
            SDL_Flip (ecran);
            SDL_Delay (200) ;
        }
    
        /////////////////////////////////
        
        SDL_FreeSurface (ecran) ;
        SDL_FreeSurface (objet) ;
        SDL_Quit() ;
        return EXIT_SUCCESS ;
    }
    

    Je ne vois pas où est le problème...
    Si quelqu'un d'autre pouvait m'aider ?

    J'utilise DevC++, ne me demandez pas pourquoi, j'aime bien, voilà.^^

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2017 à 21:51:01

      Salut,

      Vérifie le retour des fonctions à risques.

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        15 février 2017 à 23:04:28

        Comment je sais quelle fonction est à risque ? Et comment vérifier ? Sachant que dans un programme avec SDL je ne pourrais pas faire printf(...)

        -
        Edité par C++eur 15 février 2017 à 23:13:20

        • Partager sur Facebook
        • Partager sur Twitter
          15 février 2017 à 23:37:56

          Salut,

          Qu'entends tu exactement par planter ? le programme se ferme ? ptêt un code d'erreur ?

          Tu peux mettre des printf(), le résultat de printf est redirigé vers le fichier stdout.txt dans le dossier qui va bien.

          • Partager sur Facebook
          • Partager sur Twitter

          Bonhomme !! | Jeu de plateforme : Prototype.

            15 février 2017 à 23:40:14

            Je viens de tester :
            SDL_Init (SDL_INIT_VIDEO) ; //0
            SDL_FillRect(ecran, NULL, SDL_MapRGB (ecran->format, 127, 0, 255)); //0
            SDL_BlitSurface (objet, NULL, ecran, &pos) ; //0
            SDL_Flip (ecran); //0
            avec MessageBox et toutes les fonctions renvoient 0.
            Dès que ça bug MessageBox ne fait plus apparaitre de fenêtre...

            C'est possible que le problème vient de la configuration du projet ou de l'installation du SDL ?






            @drx :

            -
            Edité par C++eur 15 février 2017 à 23:43:11

            • Partager sur Facebook
            • Partager sur Twitter
              16 février 2017 à 0:32:34

              Essaie ce code.

              #include <stdio.h>
              #include <SDL/SDL.h>
               
              int main(int argc, char *argv[])
              {
                  int statut = -1;
                  if(SDL_Init(SDL_INIT_VIDEO) < 0)
                      fprintf(stderr, "Erreur SDL_Init : %s.", SDL_GetError());
                  else
                  {
                      SDL_Surface *ecran = SDL_SetVideoMode (320, 240, 32, SDL_SWSURFACE);
                      if(!ecran)
                          fprintf(stderr, "Erreur SDL_SetVideoMode : %s.", SDL_GetError());
                      else
                      {
                          SDL_Surface *objet = SDL_LoadBMP("objet.bmp");
                          if(!objet)
                              fprintf(stderr, "Erreur SDL_LoadBMP : %s.", SDL_GetError());
                          else
                          {
                              SDL_Rect pos = {120, 120};
                              SDL_Event event;
                              SDL_FillRect(ecran, NULL, SDL_MapRGB (ecran->format, 127, 0, 255));
                              SDL_BlitSurface (objet, NULL, ecran, &pos);
                              SDL_Flip (ecran);
                              do
                              {
                                  SDL_WaitEvent(&event);
                              }while(event.quit != SDL_QUIT);
                              SDL_FreeSurface(objet);
                              statut = 0;
                          }
                      }
                      SDL_Quit();
                  }
                  return statut;
              }
              

              -
              Edité par yo@n97one 16 février 2017 à 1:28:30

              • Partager sur Facebook
              • Partager sur Twitter
              Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                16 février 2017 à 1:17:51

                c'est :

                while(event.type != SDL_QUIT)

                • Partager sur Facebook
                • Partager sur Twitter

                Bonhomme !! | Jeu de plateforme : Prototype.

                  16 février 2017 à 1:27:08

                  Wow, il n'y a plus aucun bug!:)
                  Mais du coup c'est quoi qui change à part ce qui permet d'afficher les erreurs ??
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2017 à 1:28:15

                    C’est corrigé. Pas fait attention. :honte:

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                      16 février 2017 à 1:33:45

                      Re,

                      Tu as créé une boucle infinie dans ton code base. Une vraie, de celle dont on ne sort pas.

                      Tu as peut-être une surveillance de processus qui s'en est rendu compte et considère ce comportement comme un blocage du programme.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Bonhomme !! | Jeu de plateforme : Prototype.

                        16 février 2017 à 1:41:01

                        Oui c'est possible..
                        Je viens de faire quelques tests et j'ai l'impression que ça ne marche plus à partir du moment où je met une boucle justement.
                        Quand je met une boucle while ou même une for avec un nombre très grand pour répéter mon programme, ça re-plante...
                        Sauf que dans mon vrais programme (pas celui là qui me sert que de test) j'ai besoin d'une boucle comme celle ci. :/
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 février 2017 à 1:47:43

                          Je ne fais que supposer. Rien ne me permet de dire que j'ai raison.

                          J'ai quelques programmes à mon actif, et je n'ai jamais programmé de boucle infinie...

                          Au pire essais de mettre une sortie que tu n'appelleras pas, voir si ça change quelque chose :

                          char dummy = 0;
                          
                          while(1)
                          {
                            ...
                          
                            if (dummy)
                              break;
                          }
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Bonhomme !! | Jeu de plateforme : Prototype.

                            16 février 2017 à 1:52:08

                            J'ai testé ça ne marche pas :/
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 février 2017 à 10:29:31

                              Salut,

                              J'ai une explication (a propos de ton premier post)

                              Ce qui me met la puce à l'oreille, c'est ton screenshot de l'erreur.

                              Ce n'est pas "ce programme a cessé de fonctionner" (un plantage), mais "ce programme ne répond pas" : c'est pas pareil. C'est un programme qui n'échange plus de messages avec l'OS, il tourne mais il ne dialogue plus. Et Windows n'aime pas ça.

                              Et a mon avis, ça vient du fait quand tu fais ta boucle, tu ne dépiles pas les events : du coup, ils s'accumulent dans la file, et la sature probablement. Et c'est pas bon du tout. Et je pense que d'une manière ou d'une autre, Windows considère que ton application ne répond pas, car elle ne dépile rien que Windows lui envoie.

                              Si tu veux une analogie : c'est comme si Windows était un facteur, et que ton programme a une boîte aux lettres. Windows lui envoie des messages, et au bout d'un certain temps, il se rend compte que la boîte aux lettre déborde. Et c'est la qu'on peut se dire "le programme ne répond pas" (ie : le mec ne relève plus sa boîte aux lettres, c'est bizarre)

                              Pour résoudre ce soucis, prend ton premier code et tout au début de ton while, ligne 18, écris :

                              SDL_Event event;
                              while(SDL_PollEvent(&event)){}

                              Voila, avec ça tu dépile les évents (et on n'en fait rien)

                              Mais c'est vrai qu'à terme, il faudra les gérer au moins pour sortir proprement de ton programme.

                              -
                              Edité par Fvirtman 16 février 2017 à 10:32:15

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                16 février 2017 à 15:01:04

                                J'ai rajouté ces deux lignes comme ceci :
                                    ///////////////////////////////// Programme :
                                   
                                    while(1)
                                    {
                                            SDL_Event event;
                                            while(SDL_PollEvent(&event)){}
                                           
                                        SDL_FillRect(ecran, NULL, SDL_MapRGB (ecran->format, 127, 0, 255)); //0
                                        pos.x = 120 ;
                                        pos.y = 120 ;
                                .......
                                Je sais pas si c’est bien ici que je devais l’insérer, mais ça ne bug plus :) Par contre quand je le fais avec mon vrais programme de plus de 700 lignes ça ne fonctionne toujours pas. :/ Il y a exactement les mêmes symptômes que pour le programme de test. Ce que je vais faire c'est réduire le vrais programme(une version copiée-collée) étape par étape jusqu'à ce que le bug n'apparait plus, pour tester...

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 février 2017 à 15:08:03

                                  A voir. Si ça se trouve, tu as d'autres boucles ailleurs ou tu ne dépiles pas les events. 

                                  Tu fais beaucoup de boucles ? En général, il est mieux de centraliser.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                    16 février 2017 à 15:17:25

                                    Le mieux, ce serait bien que tu donnes ton programme (sur un paste ou github). C’est compliqué d’aider à l’aveugle.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                      16 février 2017 à 16:30:11

                                      Je viens de me rendre compte que ce bout de code bloque les autres events de mon programme. Quand j’appuie une touche par exemple, ça ne fait plus rien.

                                          SDL_Event event;
                                          while(SDL_PollEvent(&event)){}
                                      
                                                tp_p = SDL_GetTicks () ;
                                                SDL_PollEvent (&ev) ;
                                      
                                       // Ceci ne marche plus :
                                      
                                                if (ev.type==SDL_KEYDOWN)
                                                {
                                                     switch (ev.key.keysym.sym)
                                                     {
                                                            case SDLK_ESCAPE : cont = 0 ; break ;
                                                            //case SDL_QUIT : cont = 0 ; break ; 
                                                            case SDLK_RIGHT : key = 'r' ; break ;
                                                            case SDLK_LEFT :  key = 'l' ; break ;
                                                            case SDLK_UP :    key = 'u' ; break ;
                                                            case SDLK_DOWN :  key = 'd' ; break ;
                                                            case SDLK_RCTRL :  key = 'c' ; break ;
                                                            case SDLK_LCTRL :  key = 'c' ; break ;
                                                            case SDLK_LESS :  key = 'c' ; break ;
                                                            case SDLK_GREATER :  key = 'c' ; break ;
                                                            case SDLK_RSHIFT :  key = 's' ; break ;
                                                            case SDLK_LSHIFT :  key = 's' ; break ;
                                                     }
                                                }


                                      @yo@n97one : C'est vrais, mais le truc c'est que j'aimerais garder mon projet un peu secret. Du coup tout montrer serait une dernière issus, si vraiment personne peut m'aider comme ça...

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 février 2017 à 16:43:53

                                        Ouais, mais pourquoi tu as 2 structures d'event et 2 appels à PollEvent ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Bonhomme !! | Jeu de plateforme : Prototype.

                                          16 février 2017 à 16:52:58

                                          Mon bout de code est la pour dépiler les events dans les boucles qui n'en gèrent pas du tout, comme ton premier exemple !

                                          Ici, tu le mets juste avant un autre PollEvent (sans test de retour qui plus est).

                                          Re-concentre toi, il y a du relâchement la :)

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                            16 février 2017 à 21:37:04

                                            Ah oui ^^

                                            Par contre du coup j'ai pas compris pourquoi il faut dépiler (dans le 1er exemple) alors que ce programme n'utilise pas d'events ? Il n'y a rien qui s'accumule du coup ?




                                            Je viens de faire les tests en enlevant de plus en plus de bouts de codes pour voir à quel moment ça ne plante plus, et le résultat est vraiment bizarre. Au fur à mesure que j'enlève des fonctions SDL_BlitSurface ou SDL_Flip (ecran) il devient de plus en plus difficile à faire buger le programme. Genre la durée qu'il met avant de buger devient de plus en plus longue. Une fois que j'ai tout enlevé il ne buge plus que quand je le minimise.

                                            -
                                            Edité par C++eur 16 février 2017 à 23:06:38

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              17 février 2017 à 9:05:01

                                              C++eur a écrit:

                                              Ah oui ^^

                                              Par contre du coup j'ai pas compris pourquoi il faut dépiler (dans le 1er exemple) alors que ce programme n'utilise pas d'events ? Il n'y a rien qui s'accumule du coup ?




                                              Je viens de faire les tests en enlevant de plus en plus de bouts de codes pour voir à quel moment ça ne plante plus, et le résultat est vraiment bizarre. Au fur à mesure que j'enlève des fonctions SDL_BlitSurface ou SDL_Flip (ecran) il devient de plus en plus difficile à faire buger le programme. Genre la durée qu'il met avant de buger devient de plus en plus longue. Une fois que j'ai tout enlevé il ne buge plus que quand je le minimise.

                                              -
                                              Edité par C++eur il y a environ 9 heures


                                              Dès que tu bouges la souris, que tu appuies sur une touche, ça lance un event. je t'ai dit, c'est comme un facteur qui met des lettres dans une boite aux lettres. Il faut la vider au fur et à mesure, sinon le facteur un moment, il se dit "le mec ne relève plus rien, il est mort". Voila, le facteur c'est Windows.

                                              Pour ton 2e problème, ça ne doit pas être sur le bout de code du 1er paragraphe mais un autre.

                                              SDL qui finit par planter au bout d'un moment, et plus rarement quand tu allèges, ça sent la mémoire qui explose : regarde ton occupation mémoire dans le gestionnaire de processus : je pense que tu dois avoir une belle courbe montante, et à un moment, l'OS dit stop.

                                              Si c'est le cas, c'est que tu ne désalloues pas toutes les surfaces que tu alloues. Et ça dans une boucle.

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                                17 février 2017 à 9:53:16

                                                Salut,

                                                Non seulement Windows surveille ses processus, mais de plus en plus d'antivirus ont également tendance à surveiller un peu tout avec souvent plus de zèle que Windows pour traquer tout comportement inhabituel ou suspect.

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Bonhomme !! | Jeu de plateforme : Prototype.

                                                  17 février 2017 à 10:31:39

                                                  drx a écrit:

                                                  Salut,

                                                  Non seulement Windows surveille ses processus, mais de plus en plus d'antivirus ont également tendance à surveiller un peu tout avec souvent plus de zèle que Windows pour traquer tout comportement inhabituel ou suspect.


                                                  Remarque, c'est pas forcément plus mal, ça oblige les programmeurs à faire "au moins un peu propre" leurs programmes :)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                                    17 février 2017 à 15:52:54

                                                    Dès que tu bouges la souris, que tu appuies sur une touche, ça lance un event. je t'ai dit, c'est comme un facteur qui met des lettres dans une boite aux lettres. Il faut la vider au fur et à mesure, sinon le facteur un moment, il se dit "le mec ne relève plus rien, il est mort". Voila, le facteur c'est Windows.
                                                    Donc dès qu'il y a une boucle dans un programme avec SDL, il stocke les events, même si on en utilise pas ?


                                                    SDL qui finit par planter au bout d'un moment, et plus rarement quand tu allèges, ça sent la mémoire qui explose : regarde ton occupation mémoire dans le gestionnaire de processus : je pense que tu dois avoir une belle courbe montante, et à un moment, l'OS dit stop.
                                                    Je viens de tester et on ne vois rien d'anormale dans le gestionnaire de tâches. La courbe reste plate à un niveau normal.


                                                    Je vais tester en refaisant tout le projet mais avec SDL 2.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 février 2017 à 15:59:06

                                                      Re,

                                                      Oui, même quand TON programme tourne en boucle ou est en pause, les events sont quand-même empilés en background.

                                                      Et heureusement, sinon ça voudrait dire qu'il faudrait appuyer sur les touches pile au milliardième* de seconde où la lib se tournerait vers le clavier pour voir s'il s'y passe quelque chose...

                                                      Bonne continuation.

                                                      * Oui, j'abuse un peu, c'est une façon de parler.

                                                      -
                                                      Edité par drx 17 février 2017 à 16:01:27

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Bonhomme !! | Jeu de plateforme : Prototype.

                                                        17 février 2017 à 16:18:59

                                                        Donc dès qu'il y a une boucle dans un programme avec SDL, il stocke les events, même si on en utilise pas ?

                                                        Même sans boucle. Dès qu’un évènement arrive, la SDL le stocke. C’est juste que puisqu’il y a une boucle et que tu ne lis pas les évènements, donc ils s’accumulent.

                                                        Je viens de tester et on ne vois rien d'anormale dans le gestionnaire de tâches. La courbe reste plate à un niveau normal.

                                                        La RAM n’augmente pas, il n’y a pas de consommation supplémentaire. C’est juste que puisque tu ne fais rien, il y a accumulation, l’OS se dit qu’il y a un truc bizarre.

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                                          17 février 2017 à 16:20:49

                                                          Tu dois saturer ta file d'events, comme un facteur sature la boîte aux lettres d'un mec qui ne relève plus son courrier.

                                                          Et que se passe t il quand la boîte est pleine et que le facteur ne plus rien mettre  ? le facteur gueule.

                                                          Programme SDL = gestion des events.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                                            17 février 2017 à 16:27:19

                                                            Je désalloue bien toutes les surfaces mais tout à la fin du programme avec SDL_FreeSurface (...) ;
                                                            Et pendant l’exécution de la boucle je ne désalloue rien puisque mon programme en a besoin. Ou alors j'ai pas bien compris un truc...

                                                            @Fvirtman Enfaite dans mon programme j'utilise qu'une seule variable SDL_Event et je l'utilise qu'une seul fois au début de la boucle avec le switch et juste avant j'ai : while(SDL_PollEvent (&ev)){} ;
                                                            Je sais pas s'il faut le placer à un autre endroit du programme aussi ? dans tous les boucles for ?

                                                            -
                                                            Edité par C++eur 17 février 2017 à 16:33:29

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Programme en C avec SDL et DevC++ qui plante !

                                                            × 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