Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de variables globales

pas si globale visiblement...

Sujet résolu
    31 mai 2006 à 14:39:18

    Bonjour à tous,
    voici mon problème, j'ai créé un jeu Snake qui fonctionne mais je planche sur le changement de niveaux (je sais j'ai sauté cette étape dans les améliorations de mario ^^ ).
    J'ai créé une variable dite "globale" pour passer au niveau suivant à la fin du niveau (cela fonctionne) et pour pouvoir changer de niveau avec pageup.
    Concrêtement, cela donne :

    fichier "fichiers.c" :
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "constantes.h"
    #include "fichiers.h"

    long NIVEAUCHARGE = 1;

    int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
    CallBack callback;
    FILE* fichier = NULL;
    char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
    int i = 0, j = 0;
    long niveauChargeBis = 1, nombreDeNiveaux = 0, caractereLu = 0;

    fichier = fopen("niveaux.lvl", "r");
    if (fichier == NULL)
        return 0;

    // on compte le nombre de niveaux
    do
    {
        caractereLu = fgetc(fichier);
        if (caractereLu == '\n')
            nombreDeNiveaux++;
    } while(caractereLu != EOF);

    // chargement du bon niveau :
    rewind(fichier);
    niveauChargeBis = NIVEAUCHARGE;
    while(niveauChargeBis > 1)
    {
        caractereLu = fgetc(fichier);
        if(caractereLu == '\n')
            niveauChargeBis--;
    }
    fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);

    etc...

    if(NIVEAUCHARGE < nombreDeNiveaux)
        NIVEAUCHARGE++;
    fclose(fichier);
    return 1;
    }

    Cette partie fonctionne donc correctement.

    partie jeu.c :
    SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_PAGEUP:
                            NIVEAUCHARGE++;
                            break;

    Ce que je ne comprends pas c'est que NIVEAUCHARGE ici n'est pas déclaré, il devrait l'être si la variable est réellement globale.
    J'ai essayé plusieurs techniques infructueuses (comme initialiser NIVEAUCHARGE dans un #define (mais il ne s'incrémente pas) ou dans mon fichier "constantes.h" à l'intérieur d'une structure (celle des paramètres de mon callback), enfin bref, le résultat n'était pas là).
    Je penses quand même que la solution à mon problème est la variable GLOBALE.

    Si quelqu'un a une solution à mon problème, pensez à moi ;) .
    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      31 mai 2006 à 14:58:48

      Il faut, dans le fichier jeu.c déclarer la variable en tant qu'extern pour pouvoir l'utiliser :
      extern long NIVEAUCHARGE;

      Après, tu peux mettre cette déclaration dans un .h qui sera inclus dans tes deux fichiers .c ;)
      • Partager sur Facebook
      • Partager sur Twitter
        31 mai 2006 à 14:58:59

        euh... ^^ .
        de quoi extern?

        edit : ok merci, la réponse était plus rapide que la question ^^ .
        • Partager sur Facebook
        • Partager sur Twitter
          31 mai 2006 à 15:00:36

          Louisclem -> Grilled :p

          Anubis002 -> Extern spécifie que cette variable peut être accédée depuis tous les fichiers du projet ayant inclu le header dans laquelle cette déclaration se trouve et non depuis tout le fichier dans lequel elle est déclarée. Emploie la syntaxe rappelée par louisclem.
          • Partager sur Facebook
          • Partager sur Twitter

          Problème de variables globales

          × 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