Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programmation modulaire

#include

    4 décembre 2006 à 17:35:12

    Salut tout le monde ^^

    Bon voila j'ai commencé cet après-midi le TP de Mario Sokoban, et j'ai décidé de séparer mon code sur plusieurs fichiers. Néanmoins, je me demande si je fais bien ce qu'il faut.

    Pour l'instant, j'ai

    • un fichier main.c
    • un fichier fonct_ev.c
    • un fichier fonction_ev_head.h


    Dans fonct_ev.c : il y a toute les fonctions liées aux événements (par exemple SDL_WaitEvent(&event);

    Dans fonct_ev_head.h : c'est le header qui contient les prototypes des fonctions contenues dans fonct_ev.c

    Voici les directives de préprocesseur de chaque fichiers (c'est notamment là que je voudrais savoir si je ne fais pas de bétises ^^ )

    //Fichier : main.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "fonct_ev_head.h"


    //Fichier : fonct_ev.c

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


    //Fichier : fonct_ev_head.h

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


    Alors, y a t'il des problèmes d'includes? J'ai compiler, ça fonctionne, mais je ne voudrais pas le faire fonctionner de la mauvaise manière :D:)
    • Partager sur Facebook
    • Partager sur Twitter
      4 décembre 2006 à 18:49:15

      ?

      Je ne vois pas le problème, si la compilation ne renvoie aucune erreur ni aucun warning c'est bon.
      Par contre, petit gros détail :
      Include ton header fonct_ev_header dans ton fonct_ev.c, sinon tu risques de faire des erreurs on niveau des prototypes.
      • Partager sur Facebook
      • Partager sur Twitter
        4 décembre 2006 à 18:57:43

        okay, merci beaucoup

        et je viens de me rendre compte que c'est pas si simple, c'est possible d'appeller une fonction qui détient des évenements?
        • Partager sur Facebook
        • Partager sur Twitter
          4 décembre 2006 à 19:02:06

          Qu'est-ce que tu veux dire dire par "détenir" ?

          void ma_func(SDL_Event* ev);

          ?
          • Partager sur Facebook
          • Partager sur Twitter
            4 décembre 2006 à 19:04:40

            ça par exemple

            void gestEv(SDL_Surface *menu, SDL_Surface *ecran)
            {
                int continuer = 1;
                SDL_Event event;

                while (continuer)
                {
                    SDL_WaitEvent(&event);
                    switch (event.type)
                    {
                       case SDL_KEYUP:
                       switch (event.key.keysym.sym)
                       {
                           case SDLK_KP1:
                           SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                           SDL_FillRect(menu, NULL, SDL_MapRGB(menu->format, 255, 255, 255));
                           SDL_Flip(ecran);
                           break;

                           case SDLK_KP2:
                           // Code "éditer
                           break;

                           case SDLK_ESCAPE:
                           continuer = 0;
                           break;


                       }
                       break;
                    }


                }
            }

            • Partager sur Facebook
            • Partager sur Twitter
              4 décembre 2006 à 19:06:43

              Bien sûr c'est tout à fait possible.
              Si tu veux des précisions sur les évènements, hier soir j'ai écris un gros post, un peu par inadvertance :-° :
              http://www.siteduzero.com/forum-83-94895-830842.html#r830842
              • Partager sur Facebook
              • Partager sur Twitter
                4 décembre 2006 à 19:09:09

                merci mais je sais déja tout des événements, sauf le jystique mais je m'en fou un peu lol

                Mais je ne sais pas comment gérer ces fonctions, en modulaire
                • Partager sur Facebook
                • Partager sur Twitter
                  4 décembre 2006 à 19:18:07

                  Ben, ça ne change pas...

                  Effectivement au début on peut penser (je parle en connaissance de cause :-° ):
                  Zut, j'ai initialisé la SDL dans main, j'vais pas pouvoir m'en servir dans un autre fichier !
                  Mais c'est faux evidemment, dis-toi pour te simplifier les idées qu'un appel de fonction équivaut à remplacer le code source de la fonction à l'endroit où tu l'appelles. (ça pourra te donner une petite idée de l'effet que ça fera)
                  Evidemment ce n'est pas du tout ce que le compilateur fait! (ce n'est pas une macro) Mais si ça peut t'aider...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 décembre 2006 à 19:23:22

                    okay merci beaucoup, faut juste que je comprenne pourquoi je ne peux pas appeller la fonction pause() (qui contient des évenements) dans une autre fonction qui contient des évenements
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 décembre 2006 à 19:30:30

                      ? Ah bon ?

                      As-tu bien défini le prototype de pause() dans un fichier .h que tu as ensuite inclu dans le fichier source .c qui appel pause() ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 décembre 2006 à 19:41:50

                        Pour tes évènements,mieux vaut les intercepter dans main et les traiter dans les autres fonctions.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 décembre 2006 à 19:48:42

                          Citation : Pole

                          Pour tes évènements,mieux vaut les intercepter dans main et les traiter dans les autres fonctions.



                          Ah bon ? et pourquoi donc ?

                          Quelque chose dans ce genre:

                          ev = RecupererEvenement();
                          TraiterEvenement(ev);

                          est tout à fait faisable dans une fonction autre que main.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 décembre 2006 à 20:46:34

                            Oui,je voulais dire dans une seule fonction.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 décembre 2006 à 20:56:52

                              voici mes 3 fichiers

                              //Fichier main.c

                              #include <stdlib.h>
                              #include <stdio.h>
                              #include <SDL/SDL.h>
                              #include <SDL/SDL_image.h>
                              #include "fonct_ev_head.h"

                              int main(int argc, char *argv[])
                              {
                                  SDL_Surface *ecran = NULL, *menu = NULL;
                                  SDL_Surface *marioBas = NULL, *marioHaut = NULL, *marioGauche = NULL, *marioDroite = NULL;
                                  SDL_Surface *mur = NULL, *caisse = NULL, *caisse_OK = NULL, *objectif = NULL;
                                  SDL_Rect pos_mB, pos_mH, pos_mG, pos_mD, pos_menu, pos_mur, pos_c, pos_cOK, pos_obj;
                                  SDL_Event event;

                                  pos_menu.x = 400 - 204;
                                  pos_menu.y = 80;

                                  SDL_Init(SDL_INIT_VIDEO);

                                  ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);


                                  menu = IMG_Load("menu.jpg");
                                  marioBas = IMG_Load("mario_bas.gif");
                                  marioGauche = IMG_Load("mario_gauche.gif");
                                  marioDroite = IMG_Load("mario_droite.gif");
                                  mur = IMG_Load("mur.jpg");
                                  caisse = IMG_Load("caisse.jpg");
                                  caisse_OK = IMG_Load("caisse_ok.jpg");
                                  objectif = IMG_Load("objectif.png");


                                  SDL_BlitSurface(menu, NULL, ecran, &pos_menu); // Affichage menu
                                  SDL_Flip(ecran);

                                  gestEv(&menu, &ecran);

                                  SDL_FreeSurface(ecran);
                                  SDL_Quit;
                              }



                              //Fichier fonct_ev.c

                              #include <stdlib.h>
                              #include <stdio.h>
                              #include <SDL/SDL.h>
                              #include <SDL/SDL_image.h>
                              #include "fonct_ev_head.h"


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

                                  while (continuer)
                                  {
                                      SDL_WaitEvent(&event);
                                      switch (event.type)
                                      {
                                          case SDL_KEYUP:
                                          switch (event.key.keysym.sym)
                                          {
                                              case SDLK_ESCAPE:
                                              continuer = 0;
                                              break;
                                          }
                                          break;

                                          case SDL_QUIT:
                                          continuer = 0;
                                          break;
                                      }
                                  }
                              }

                              void gestEv(SDL_Surface *menu, SDL_Surface *ecran)
                              {
                                  int continuer = 1;
                                  SDL_Event event;
                                  FILE *fichier = NULL;

                                  while (continuer)
                                  {
                                      SDL_WaitEvent(&event);
                                      switch (event.type)
                                      {
                                         case SDL_KEYUP:
                                         switch (event.key.keysym.sym)
                                         {
                                             case SDLK_KP1:
                                             SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                                             SDL_FillRect(menu, NULL, SDL_MapRGB(menu->format, 255, 255, 255));
                                             SDL_Flip(ecran);
                                             pause();
                                             break;

                                             case SDLK_KP2:
                                             // Code "éditer
                                             break;

                                             case SDLK_ESCAPE:
                                             continuer = 0;
                                             break;


                                         }
                                         break;
                                      }
                                  }
                              }


                              //Fichier fonct_ev_head.h

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

                              void gestEv(SDL_Surface *menu, SDL_Surface *ecran);
                              void pause();



                              Vous voyez bien dans ma fonction gestEv, j'appelle la fonction pause(), mais pourtant, vous pouvez compiler ce programme, le va tout de suite s'arrêter si j'appuis sur 1, qui normalement doit rendre la page blanche
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 décembre 2006 à 21:06:40

                                Je ne dis pas que ça ne compile pas,mais que si plus de 5 fonctions gèrent les évènements,ça va être difficile de tout gérer.
                                Un petit exemple : tu veux afficher zozor à l'endroit de la souris. Si tu fais une fonction qui intercepte les évènements et que quand tu bouges ça blit zozor au bon endroit,c'est râté.
                                Parce qu'il n'y a que cette fonction qui interceptera els évènement. Mieux vaut mettre une fonction qui intercepte,puis tu envoies à la fonction qui blit l'évènement.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 décembre 2006 à 21:22:27

                                  ok donc en fait tu pense que je devrai faire une fonction par évenement?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 décembre 2006 à 21:56:27

                                    Si,mais tu passes l'évènement par argument. Pas de SDL_PollEvent ou SDL_WaitEvent (sauf si tu fais une pause).
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 décembre 2006 à 22:02:41

                                      void gestEv(SDL_Surface *menu, SDL_Surface *ecran)
                                      {
                                          SDL_Event event;

                                          if (event.type == SDL_KEYUP)
                                          {
                                              switch (event.key.keysym.sym)
                                              {
                                                  case SDLK_KP1:
                                                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                                                  SDL_FillRect(menu, NULL, SDL_MapRGB(menu->format, 255, 255, 255));
                                                  SDL_Flip(ecran);
                                                  break;
                                              }
                                          }
                                      }



                                      un truc comme ça?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 décembre 2006 à 22:18:57

                                        Citation : -Skypers-

                                        Bon voila j'ai commencé cet après-midi le TP de Mario Sokoban, et j'ai décidé de séparer mon code sur plusieurs fichiers. Néanmoins, je me demande si je fais bien ce qu'il faut.

                                        Pour l'instant, j'ai

                                        • un fichier main.c
                                        • un fichier fonct_ev.c
                                        • un fichier fonction_ev_head.h

                                        STOP !

                                        Tu te compliques la vie. .h signifie déjà header. :
                                        • un fichier main.c
                                        • un fichier ev.c
                                        • un fichier ev.h

                                        Par ce qu'il est parfaitement logique que l'unité fonctionnelle "ev" soit formée d'un fichier d'interface ev.h et d'un fichier d'implémentation ev.c. C'est l'essence même de la programmation modulaire. Il y existe un lien 'organique' entre le .h et le .c, et c'est le nom de l'unité fonctionnelle.

                                        C'est le moment de lire ça :

                                        http://mapage.noos.fr/emdel/codage.htm

                                        Je rappelle que la modularisation ne se fait pas au hasard. C'est le résultat de la conception, qui a, entre autre, pour objet de découper le projet en un arbre dont les branches sont les blocs fonctionnels et les feuilles les unités fonctionnels (UF).

                                        Ensuite, l'implémentation (ou réalisation ou codage) découpe l'UF en fonctions, puis instructions.
                                        Ensuite, le compilateur divise les instructions C en instructions assembleurs traduites directement en code machine.

                                        Je continue avec le microprocesseur, les unités de calculs et de traitements, les circuits logiques, les transistors, le silicium N et P, la structure de l'atome de silicium, le noyau, les particules...?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Music only !
                                          4 décembre 2006 à 22:21:58

                                          :-°o_O

                                          Je ne pense pas :p

                                          Juste, je voudrais en fait que mon prgramme affiche un menu sous forme d'image (ça c'est fait), puis lorsqu'on appui sur 1 il efface tout pour une page blanche. Mais si dans tout ça on appui sur Esc ou si on ferme la fenêtre le programme se ferme. Ben j'y arrive pas!
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            5 décembre 2006 à 17:15:38

                                            Citation : -Skypers-

                                            void gestEv(SDL_Surface *menu, SDL_Surface *ecran)
                                            {
                                                SDL_Event event;

                                                if (event.type == SDL_KEYUP)
                                                {
                                                    switch (event.key.keysym.sym)
                                                    {
                                                        case SDLK_KP1:
                                                        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                                                        SDL_FillRect(menu, NULL, SDL_MapRGB(menu->format, 255, 255, 255));
                                                        SDL_Flip(ecran);
                                                        break;
                                                    }
                                                }
                                            }



                                            un truc comme ça?


                                            J'aurais plutôt appelé la fonction menu,mais c'est bon.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              5 décembre 2006 à 17:50:10

                                              j'ai essayé ça ne marche pas, je ne sais pas pourquoi

                                              J'ai transformé tout ça :

                                              //main.c

                                              #include <stdlib.h>
                                              #include <stdio.h>
                                              #include <SDL/SDL.h>
                                              #include <SDL/SDL_image.h>
                                              #include "jouer.h"


                                              int main(int argc, char *argv[])
                                              {
                                                  SDL_Surface *ecran = NULL, *menu = NULL;
                                                  SDL_Event event;
                                                  SDL_Rect pos_menu;
                                                  int continuer = 1;

                                                  pos_menu.x = 400 - 204;
                                                  pos_menu.y = 80;

                                                  SDL_Init(SDL_INIT_VIDEO);

                                                  ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                                                  menu = IMG_Load("menu.jpg");


                                                  SDL_BlitSurface(menu, NULL, ecran, &pos_menu); // Affichage menu
                                                  SDL_Flip(ecran);

                                                  while (continuer)
                                                  {
                                                      SDL_WaitEvent(&event);
                                                      switch (event.type)
                                                      {
                                                          case SDL_KEYUP:
                                                          switch (event.key.keysym.sym)
                                                          {
                                                              case SDLK_ESCAPE:
                                                              continuer = 0;
                                                              break;

                                                              case SDLK_KP1:
                                                              jouer(&ecran);
                                                              break;

                                                              case SDLK_KP2:
                                                              // Fonction éditer
                                                              break;
                                                          }
                                                          break;

                                                          case SDL_QUIT:
                                                          continuer = 0;
                                                          break;
                                                      }
                                                  }

                                                  SDL_FreeSurface(ecran);
                                                  SDL_Quit;
                                              }


                                              //jouer.c

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


                                              void jouer(SDL_Surface *ecran)
                                              {
                                                  SDL_Surface *marioBas = NULL, *marioHaut = NULL, *marioGauche = NULL, *marioDroite = NULL;
                                                  SDL_Surface *mur = NULL, *caisse = NULL, *caisse_OK = NULL, *objectif = NULL, *map = NULL;
                                                  SDL_Rect pos_mB, pos_mH, pos_mG, pos_mD, pos_mur, pos_c, pos_cOK, pos_obj, pos_map;
                                                  SDL_Event event;
                                                  int continuer = 1;

                                                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                                                  SDL_BlitSurface(map, NULL, ecran, &pos_map);
                                                  SDL_Flip(ecran);

                                                  do
                                                  {
                                                      SDL_WaitEvent(&event);
                                                      switch (event.type)
                                                      {
                                                          SDL_QUIT:
                                                          continuer = 0;
                                                          break;

                                                          SDL_KEYUP:
                                                          switch (event.key.keysym.sym)
                                                          {
                                                              SDLK_ESCAPE:
                                                              continuer = 0;
                                                              break;
                                                          }
                                                          break;
                                                      }
                                                      break;
                                                  }while(continuer);

                                              }








                                              Lorsque ça arrive à la première boucle, tout marche : le programme appelle la fonction jouer. Mais, dans la fonction jouer, lorsque ça arrive à la boucle, plus rien ne fonctionne :(:(:(
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                5 décembre 2006 à 18:02:15

                                                Pour la deuxiemme fois:
                                                Pourquoi tes .c n'incluent pas leur .h respectif ???
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  5 décembre 2006 à 18:15:26

                                                  oups désolé je corrige ça

                                                  sinon personne peut m'expliquer ce problème?

                                                  oups désolé je corrige ça

                                                  sinon personne peut m'expliquer ce problème?

                                                  EDIT : Yeesssss je viens de trouver, encore une de mes erreurs, et devinez quoi, j'en ai déja parlé! Les pointeurs!

                                                  //jouer.h

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


                                                  void jouer(SDL_Surface *ecran);


                                                  //main.c

                                                  //[...]

                                                  case SDLK_KP1:
                                                  jouer(&ecran);
                                                  break;


                                                  Le & était en trop. Ca m'énerve je ne sais pas pourquoi il était en trop, ou alors c'est parce que je lui avais dis de prendre l'adresse du pointeur, puis de me donner la valeur, soi l'adresse, alors que sans &, il me donne l'adresse de la variable sur où pointe le pointeur, puis sa valeur, oui ça doit être ça
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Programmation modulaire

                                                  × 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