Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de variable globale

    16 avril 2006 à 19:46:50

    Bonjour ! Je fais un petit programme en SDL, et j'ai besoin que certaine variable soient globales.

    Donc comme M@theo nous le dit, je déclare ma variable ( SDL_Event event ) en dehors de la fonction main, dans le fichier main.c

    Et là, M@theo nous dit que ça doit être accessibles dans toutes les fonctions de tous les fichiers, elle est effectivement accessible dans ma fonction main c'est déjà ça, mais dans un autre fichier, fond.c, il y a un bug à la compilation ( Code:Blocks )

    Le debugger m'informe gentillement :
    Error : `event`undeclared ( first use in this function )

    (Each undeclared identifier is reported only once for each fonction it appears in.)


    Je comprends par là que je n'ai pas déclaré event, et que le debugger me dit qu'il me le dit qu'une seule fois si cette erreur apparait plusieurs fois dans la fonction ( mais je ne l'utilise qu'un fois alors y a pas de soucis de ce côté )

    Ne vois t-il pas ma variable globale ?? Ou M@theo nous aurait-t-il berné ? :o

    Merci d'avance pour vos futures réponses !
    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2006 à 20:04:11

      SDL_Event event; se met dans le fichier Main ET dans la fonction Main .. pas en dehors :-°


      #include <SDL/SDL.h>

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

      /* ... [...] ... */

      SDL_Event event;

      /* ... [...] ... */

      SDL_Quit();
      return EXIT_SUCCESS
      }



      • Partager sur Facebook
      • Partager sur Twitter
        16 avril 2006 à 20:05:22

        Mais c'est pour qu'elle soit globale que je l'a mais en dehors de la fonction main
        • Partager sur Facebook
        • Partager sur Twitter
          16 avril 2006 à 20:19:48

          :-° alors tu as du mettre la fonction entière non ?
          Pas seulement SDL_Event event;
          • Partager sur Facebook
          • Partager sur Twitter
            16 avril 2006 à 20:42:13

            Hein ? Désolé j'ai pas compris, de quoi tu parles ?
            • Partager sur Facebook
            • Partager sur Twitter
              16 avril 2006 à 20:43:16

              :euh: a moins que je dise n'importe quoi ... une fonction globale ressemble à sa :


              void fonction(long truc,char *machin);


              • Partager sur Facebook
              • Partager sur Twitter
                16 avril 2006 à 20:46:21

                Mais je parles de variable globale ;)

                En surffant un peu sur le site, je vois que c'est déconseillé, je penses je vais faire sans alors...
                • Partager sur Facebook
                • Partager sur Twitter
                  16 avril 2006 à 20:47:45

                  o_O bon ben dsl mais je vois pas trop ...

                  ^^ je me souviens pas souvent des choses déconseillées
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 avril 2006 à 21:01:11

                    La variable globale est accessible sur toute les fonction du fichier dans lequel elle est déclarée :) Pour la rendre accessible sur un autre fichier tu met:

                    extern SDL_Event event


                    (enfin je crois j'ai jamais touché aux extern mais théoriquement elle s'utilise comme ça ^^)

                    donc je récatipule(récapitule ^^ )

                    main.c:

                    #include <stdio.h>
                    ...

                    SDL_Event event;

                    int main()
                    {
                    }

                    et l'autre fichier:

                    #include <stdio.h>
                    ...

                    extern SDL_Event event;

                    void blabla()
                    {
                    }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 avril 2006 à 21:42:36

                      Citation : socomajor

                      Bonjour ! Je fais un petit programme en SDL, et j'ai besoin que certaine variable soient globales.


                      'besoin'... il faut le dire vite...

                      Citation : socomajor


                      je déclare ma variable ( SDL_Event event ) en dehors de la fonction main, dans le fichier main.c

                      <...>elle est effectivement accessible dans ma fonction main c'est déjà ça, mais dans un autre fichier, fond.c, il y a un bug à la compilation ( Code:Blocks )


                      Normal, elle n'est pas déclarée.

                      La bonne methode est de définir un header qui contient la déclaration de la globale

                      /* global.h */
                      #ifndef H_GLOBAL
                      #define H_GLOBAL

                      #include <SDL/sdl.h>

                      extern SDL_Event event;

                      #endif /* guard */

                      et d'inclure ce fichier dans main.c et dans fonc.c

                      http://mapage.noos.fr/emdel/notes.htm#globales
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        16 avril 2006 à 21:45:12

                        Okay merci beaucoup à tous les deux !

                        Finalement je m'en suis tiré sans à ce que j'ai compris c'est mieux ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 avril 2006 à 21:47:38

                          Citation : socomajor

                          Finalement je m'en suis tiré sans à ce que j'ai compris c'est mieux ^^


                          C'est bien.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            16 avril 2006 à 22:18:23

                            Citation : -ed-

                            Citation : socomajor

                            Bonjour ! Je fais un petit programme en SDL, et j'ai besoin que certaine variable soient globales.


                            'besoin'... il faut le dire vite...

                            Citation : socomajor


                            je déclare ma variable ( SDL_Event event ) en dehors de la fonction main, dans le fichier main.c

                            <...>elle est effectivement accessible dans ma fonction main c'est déjà ça, mais dans un autre fichier, fond.c, il y a un bug à la compilation ( Code:Blocks )


                            Normal, elle n'est pas déclarée.

                            La bonne methode est de définir un header qui contient la déclaration de la globale


                            /* global.h */
                            #ifndef H_GLOBAL
                            #define H_GLOBAL

                            #include <SDL/sdl.h>

                            extern SDL_Event event;

                            #endif /* guard */


                            et d'inclure ce fichier dans main.c et dans fonc.c

                            http://mapage.noos.fr/emdel/notes.htm#globales



                            Si tu utilise cette méthode, n' oublie pas d' ajouter

                            SDL_Event event;


                            Dans un fichier .c

                            Le extern SDL_Event event declare simplement qu' il existe une variable globale quelque part dans le projet nommé Event.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 avril 2006 à 23:25:05

                              C'est vrai que les variables globales sont déconseillés mais pour utiliser une variable globale qui soit accessible a plusieurs fichiers.c (si c'etait bien ca ta question), il fallait déclarer ta variable dans un fichier.h que tu aurais inclue dans tes fichiers.c

                              my.h

                              #ifndef _MY_H_
                              #define _MY_H_

                              int   my_global_var;

                              /*
                              ** prototypes des fonctions...
                              */


                              #endif /* _MY_H_ */


                              p.s: je code sous unix, je sais pas si c'est exactement pareil sous windows.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 avril 2006 à 2:49:13

                                Si tu utilise pas de fonction tordue ou la fonction system() ba ça devrais être pareil (autrement dit: si tu utilise les fonction standard uniquement tout baigne ...(...mais y'en a forcément un qui coule (ça va je usis sorti ^^)))
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 avril 2006 à 10:17:24

                                  Citation : Dj_Nash

                                  C'est vrai que les variables globales sont déconseillés mais pour utiliser une variable globale qui soit accessible a plusieurs fichiers.c (si c'etait bien ca ta question), il fallait déclarer ta variable dans un fichier.h que tu aurais inclue dans tes fichiers.c

                                  my.h


                                  #ifndef _MY_H_
                                  #define _MY_H_

                                  int   my_global_var;

                                  /*
                                  ** prototypes des fonctions...
                                  */


                                  #endif /* _MY_H_ */



                                  Erreur de conception.

                                  Bien que ce soit techniquement possible, on ne definit ni fonction ni objet dans un .h. En effet, si le fichier est inclus dans 2 .c différents, il y aura double définition ce qui invoque un comportement indéfini.

                                  Lire ma réponse précédente et l'article dont j'ai mis la référence.

                                  http://www.siteduzero.com/forum-83-33403-250500.html#r250500

                                  D'autre part, les identificateurs commençant par _ suivis de _ou A-Z sont réservés à l'implémentation.

                                  http://mapage.noos.fr/emdel/codage.htm#nom_underscore
                                  http://mapage.noos.fr/emdel/notes.htm#id_reserve
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !
                                    17 avril 2006 à 18:44:18

                                    Citation : -ed-


                                    Erreur de conception.


                                    Bien que ce soit techniquement possible, on ne definit ni fonction ni objet dans un .h. En effet, si le fichier est inclus dans 2 .c différents, il y aura double définition ce qui invoque un comportement indéfini.



                                    C'est pour ca que dans le .h il y a #ifndef..., c'est pour protéger le fichier.h, donc meme si il est défini dans plusieurs .c, il n'y aura aucun problème.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 avril 2006 à 20:11:48

                                      Citation : Dj_Nash

                                      Citation : -ed-


                                      Erreur de conception.


                                      Bien que ce soit techniquement possible, on ne definit ni fonction ni objet dans un .h. En effet, si le fichier est inclus dans 2 .c différents, il y aura double définition ce qui invoque un comportement indéfini.



                                      C'est pour ca que dans le .h il y a #ifndef..., c'est pour protéger le fichier.h, donc meme si il est défini dans plusieurs .c, il n'y aura aucun problème.


                                      Hé hé, je m'attendais à celle-ci. Tu as testé ?

                                      Reprenons. La protection dans le .h est faite pour protéger contre les inclusions mutiples d'un même .h dans le même fichier .c. Et oui. Comme souvent, la fin de phrase est omise...

                                      Si il s'agit de 2 fichier .c différent, ça n'a bien sûr aucun effet. Vu du compilateur, ce sont deux fichiers différents, traités individuellement. Donc rien n'empèche d'inclure le .h dans le premier et le dans le second .c.


                                      /* data.h  */
                                      int x;
                                      void f(void);


                                      /* a.c */
                                      #include "data.h"
                                      #include <stdio.h>

                                      void f(void)
                                      {
                                         printf ("x=%d\n");
                                      }


                                      /* b.c */
                                      #include "data.h"

                                      int main (void)
                                      {
                                         x = 1;
                                         f();
                                      }

                                      Ce code est incorrect, mais il fonctionne avec MinGW (gcc) (probablement dû à un tolérance du linker, qui considère qu'il n'y a qu'une variable).

                                      Ma démonstration tombe à l'eau.

                                      A ma connaissance, il ne fonctionne absolument pas avec les compilateurs Borland ou Microsoft (double définition de variable). (Je n'ai pas ces compilateurs, si d'autres peuvent vérifier...)

                                      Je déconseille donc formellement cette pratique.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Music only !
                                        18 avril 2006 à 2:29:45

                                        C'est exact, je n'ai pas testé :-°
                                        Après reflexion tu as surement raison, pour les variables globales ça mettrai un "multiple definition...". En fait j'en utilise jamais (parce dans mon école on a pas le droit aux globales :euh: ).
                                        Au temps pour moi :D
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 avril 2006 à 8:56:32

                                          Citation : Dj_Nash

                                          Après reflexion tu as surement raison, pour les variables globales ça mettrai un "multiple definition...". En fait j'en utilise jamais (parce dans mon école on a pas le droit aux globales


                                          C'est une Bonne Chose. Les cas où les globales sont indispensables sont extrêmement rares, et concernent plutôt des applications 'avancées'.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Music only !

                                          Problème de variable globale

                                          × 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