Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C]Erreur etrange

Sur une boucle

    20 août 2006 à 17:54:25

    Bonjour les zéros,

    Je travaille sur une fonction qui charge un niveau dans un fichier texte. Pour cela je fais une boucle comme celle-ci:


        FILE *niveau = NULL;
        niveau = fopen("niveau.txt", "r");
        if(niveau != NULL)
        {
            while(j <= NB_CASES_HAUTEUR)
            {
                while(i <= NB_CASES_LARGEUR)
                {
                    fscanf(niveau, "%ld%ld ", &fondActuel, &objetActuel);
                    map[i][j].fond = fondActuel;
                    map[i][j].objet = objetActuel;
                    i++;
                }
                j++;
                i = 0;
            }
        }
        else
        {
            fprintf(stderr, "Erreur chargement niveau");
        }


    Seulement, celle ci est une boucle infinie.... Alors que quand je fais ceci cela marche parfaitement:



        FILE *niveau = NULL;
        niveau = fopen("niveau.txt", "r");
        if(niveau != NULL)
        {
            while(j <= NB_CASES_HAUTEUR)
            {
                while(i <= NB_CASES_LARGEUR)
                {

                    i++;
                }
                j++;
                i = 0;
            }
        }
        else
        {
            fprintf(stderr, "Erreur chargement niveau");
        }


    PS: J'ai tenté d'y remédier en regardant quelles valeurs avaient i et j pendant la boucle infinie, en faisant des fprintf. J'ai remarqué que lorque "j" arrivait a 8, elle revenait a 0. Tres etrange!
    • Partager sur Facebook
    • Partager sur Twitter
      20 août 2006 à 20:10:32

      Fais des boucle for au lieu des while... ce sera mieux :) .
      • Partager sur Facebook
      • Partager sur Twitter
        20 août 2006 à 20:35:20

        Oui j'ai essayé, ca fait pareil...
        • Partager sur Facebook
        • Partager sur Twitter
          20 août 2006 à 20:40:32

          Lu :)
          Et si tu mets des < au lieu des <= dans tes while, ça donne quoi ? Sinon pourrais-tu mettre un peu plus de code ?
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            20 août 2006 à 20:44:09

            Ce n'est pas un problème de boucle infini, il doit s'agir d'un échec de fscanf.

            fscanf(niveau,"%ld%ld ",&map[i][j].fond,&map[i][j].objet);

            Pour résoudre le problème il nous manque :

            - Le contenu du fichier "niveau.txt"
            - La déclaration de map et autres constantes NB_CASES_HAUTEUR, etc...
            Comment sont initialisés i et j ?
            Post plus de code silteplait.
            • Partager sur Facebook
            • Partager sur Twitter
              20 août 2006 à 20:45:07

              Je vais vous donner le code, laissez moi juste quelques secondes... je vais editer

              EDIT: Voila:


              Variables.h
              #ifndef DEF_CONSTANTES
              #define DEF_CONSTANTES

                  #define TAILLE_BLOC         40 // Taille d'un bloc (carré) en pixels
                  #define NB_CASES_LARGEUR    15
                  #define NB_CASES_HAUTEUR    15
                  #define LARGEUR_FENETRE     TAILLE_BLOC * NB_CASES_LARGEUR
                  #define HAUTEUR_FENETRE     TAILLE_BLOC * NB_CASES_HAUTEUR

                  typedef enum Fond Fond;
                  enum Fond
                  {
                      HERBE, SABLE, TERRE
                  };

                  typedef enum Objet Objet;
                  enum Objet
                  {
                      VIDE, MUR, PIERRE, TROU
                  };

                  enum {HAUT, BAS, GAUCHE, DROITE};

                  typedef struct Emplacement Emplacement;
                  struct Emplacement
                  {
                    Fond fond;
                    Objet objet;
                  };
              #endif



              SDL_fonctions.c
              #include <SDL/SDL.h>
              #include "variables.h"

              void effacerEcran(SDL_Surface *ecran)
              {
                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
              }

              int jouer(SDL_Surface *ecran)
              {
                  //----------------------------------------Variables
                  long i = 0, j = 0, v = 0,objetActuel = 0, fondActuel = 0;
                  int continuer = 1;
                  int finProgramme = 0;
                  SDL_Surface *personnage = NULL;
                  SDL_Event event;
                  effacerEcran(ecran);
                  Emplacement map[NB_CASES_LARGEUR][NB_CASES_HAUTEUR] = {0};
                  //-------------------------------------Chargement Niveau
                  FILE *niveau = NULL;
                  niveau = fopen("niveau.txt", "r");
                  if(niveau != NULL)
                  {
                      for(j = 0; j <= NB_CASES_HAUTEUR; j++)
                      {
                          for(i = 0; i <= NB_CASES_LARGEUR; i++)
                          {
                              fscanf(niveau, "%ld%ld ", &map[i][j].fond, &map[i][j].objet);
                          }
                          i = 0;
                      }
                  }
                  else
                  {
                      fprintf(stderr, "Erreur chargement niveau");
                  }
                  //-------------------------------------Initialisation Personnage et decor
                  personnage = IMG_Load("personnage.png");
                  SDL_Rect XY_personnage;
                  XY_personnage.x = 0;
                  XY_personnage.y = 0;
                  personnage->w = 32;
                  personnage->h = 48;
                  SDL_SetColorKey(personnage, SDL_SRCCOLORKEY, SDL_MapRGB(personnage->format, 255, 128, 64));
                  SDL_BlitSurface(personnage, NULL, ecran, &XY_personnage);
                  SDL_Flip(ecran);
                  while(continuer)
                  {
                          SDL_WaitEvent(&event);
                          switch(event.type)
                          {
                                  case SDL_KEYDOWN:
                                      switch(event.key.keysym.sym)
                                      {
                                              case SDLK_ESCAPE:
                                              continuer = 0;
                                              break;
                                      }
                                  break;

                                  case SDL_QUIT:
                                  continuer = 0;
                                  finProgramme = 1;
                                  break;

                          }
                  }
                  SDL_FreeSurface(personnage);
                  return finProgramme;
              }


              SDL_Fonctions.h

              #include <SDl/SDL.h>

              int jouer(SDL_Surface *ecran);


              void effacerEcran(SDL_Surface *ecran);



              main.c
              #include <stdlib.h>
              #include <stdio.h>
              #include <SDL/SDL.h>
              #include <SDL/SDL_image.h>
              #include "variables.h"
              #include "SDL_fonctions.h"

              int main(int argc, char *argv[])
              {
                  //-----------------------------------Initialisation SDL
                  SDL_Surface *ecran = NULL;
                  SDL_Init(SDL_INIT_VIDEO);
                  SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);
                  ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                  SDL_WM_SetCaption("Phoenix", NULL);
                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                  //------------------------------------MENU
                  SDL_Surface *menu = IMG_Load("menu.bmp");
                  SDL_Rect position;
                  position.x = 0;
                  position.y = 0;
                  SDL_Event event;
                  int continuer = 1, choix = 0, finProgramme = 0;
                  while(continuer)
                  {
                      effacerEcran(ecran);
                      SDL_BlitSurface(menu, NULL, ecran, &position);
                      SDL_Flip(ecran);
                      SDL_WaitEvent(&event);
                      switch(event.type)
                      {
                          case SDL_KEYDOWN:
                              switch(event.key.keysym.sym)
                              {
                                      case SDLK_ESCAPE:
                                      continuer = 0;
                                      break;

                                      case SDLK_RETURN:
                                      continuer = 1;
                                      choix = 1;
                                      break;

                                      default:
                                      continuer = 1;
                                      break;
                              }
                          break;

                          case SDL_QUIT:
                              continuer = 0;
                          break;

                       }
                          //------------------------------------Evenements de jeu(Boucle principale de jeu)
                      if(choix == 1)
                      {
                          finProgramme = jouer(ecran);
                          choix = 0;
                      }
                      if(finProgramme == 1)
                      {
                          continuer = 0;
                      }
                  }
                  //------------------------------------Fin du jeu
                  SDL_Quit();
                  SDL_FreeSurface(menu);
                  return EXIT_SUCCESS;
              }





              Merci d'avance :)
              • Partager sur Facebook
              • Partager sur Twitter
                20 août 2006 à 20:50:00

                Mets des < au lieu des <= tu dépasses la taille du tableau à chaque fois.
                • Partager sur Facebook
                • Partager sur Twitter
                  20 août 2006 à 20:51:20

                  OK je vais essayer

                  EDIT: Tout marche... sauf que map[nimportequoi][nimportequoi] vaut toujours 0 :'(

                  Mon niveau.txt contient


                  13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13


                  Chaque nombre, le premier indique le fond le second l'objet dessus...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 août 2006 à 21:04:42

                    Le premier nombre (le fond) c'est 13 et le second (l'objet) c'est aussi 13 ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 août 2006 à 21:06:20

                      Non je viens de remarquer ca non c'est fond 1 objet 3 alors je viens de changer et je l'ai mis comme sa
                      1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        20 août 2006 à 21:07:32

                        Dans ton fichier tes nombres sont séparés par des espaces, la chaine de format du fscanf doit donc respecté cette présentation :

                        "%ld%ld " => faux
                        "%ld %ld " => correct

                        Vérifie que ton fichier contienne le bon nombre de données également.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 août 2006 à 21:19:39

                          J'ai reglé ces deux choses.... toujours le même problème.... Apparament sa vient de

                          fscanf(niveau, "%ld %ld", ...);


                          Parce que j'ai testé objetActuel et fondActuel valent 0...
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            20 août 2006 à 21:23:58

                            Normal, je ne vois pas en quoi ces deux variables devraient être affectées par :

                            fscanf(niveau, "%ld%ld ", &map[i][j].fond, &map[i][j].objet);

                            Affiche le contenu de chaque case de ta variable map pour voir si ça a marché.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 août 2006 à 21:28:18

                              rien n'a marché, ni avec
                              1. fscanf(niveau, "%ld%ld ", &map[i][j].fond, &map[i][j].objet);

                              ni meme avec
                              1. fscanf(niveau, "%ld ", &fondActuel);
                              2.                 fscanf(niveau, "%ld", &objetActuel)

                              dur dur :S
                              • Partager sur Facebook
                              • Partager sur Twitter

                              [C]Erreur etrange

                              × 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