Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Erreurs introuvables

(sûrement au niveau des pointeurs, pointeurs de fonctions et des structures)

Sujet résolu
    20 avril 2006 à 11:27:03

    Je programme depuis le debut du cours de Mateo, et ce matin, je me suis lancer dans un code pour créer une BDD (Banque De Données) pour gérer un inventaire de RPG (genre Fallout pour ceux qui connaissent.)

    J'ai créer les fichiers :
    • "listeArme.txt", qui contiend mes informations.
    • "ressources.txt", qui contiend des informations sur comment est organisé "listeArme.txt"
    • "main.c", qui contiend le main et ma fonction pour lire/enregistrer un fichier.
    • "Structures.h", qui contiend ma structure Arme.

    main.c



    /*
    main.c
    ------------

    Par Kl3M, pour Fallout3

    Rôle : Lis un fichier de stockage des informations concernant les armes,
           et restitue ces informations
    */

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

    lireFichier (int *nbArme, Arme Armes[]);

    main (int argv, char* argc[])
    {
            //declaration des variables
            Arme Armes[10];
            int nbArme = 0, i;
                   
            //Entrée dans les fichier       
            lireFichier (&nbArme, Armes[]) :
           
            //Verification
            for(i, i < nbArme, i++)
            {
                    printf("\nnom : %s\n", Armes[i].nom);
                    printf("\ttype : %ld\n", Armes[i].type);
                    printf("\tdegat : %ld, %ld-%ld\n", Armes[i].typeDgt, Armes[i].dgtMin, Armes[i].dgtMax);
                    printf("\tportee : %ld\n", Armes[i].portee);
                    printf("\tchargeur : %ld\n", Armes[i].chargeur);
                    printf("\tmunitions : %ld\n", Armes[i].typeMunition);
                    printf("\tdefinition : %s\n", Armes[i].definition);
            }
           
           
    }

    lireFichier (int *nbArme, Arme Armes[])
    {
            //declaration des variables
            FILE *fichier = NULL;
            int i = 0;
           
            fichier = fopen ("listeArmes.txt", "r");
           
            fscanf(fichier, "{%ld}\n", nbArme);
           
            for (i = 0 ; i < *nbArme ; i++)
            {
            //fscanf(fichier, "{%ld}{%ld}{%ld}", Armes[i]->id, Armes[i]->nom, Armes[i]->type);
            //fscanf(fichier, "{%ld}{%ld}{%ld}", Armes[i]->typeDgt, Armes[i]->dgtMin, Armes[i]->dgtMax);
            //fscanf(fichier, "{%ld}{%ld}{%ld}\n", Armes[i]->portee, Armes[i]->chargeur, Armes[i]->typeMunition);
            //fscanf(fichier, "{%ld}\n", Armes[i]->definition);
            fscanf(fichier, "{%ld}{%ld}{%ld}", Armes[i].id, Armes[i].nom, Armes[i].type);
            fscanf(fichier, "{%ld}{%ld}{%ld}", Armes[i].typeDgt, Armes[i].dgtMin, Armes[i].dgtMax);
            fscanf(fichier, "{%ld}{%ld}{%ld}\n", Armes[i].portee, Armes[i].chargeur, Armes[i].typeMunition);
            fscanf(fichier, "{%ld}\n", Armes[i].definition);
        }
           
            fclose(fichier);
    }




    Structures.h



    /*
    structures.h
    ------------

    Par Kl3M, pour Fallout3

    Rôle : Definis les structures de l'application
    */


    typedef struct Arme Arme ;
    struct Arme
    {
            int id;
            char nom[100];
            int type;
            int typeDgt;
            int dgtMin;
            int dgtMax;
            int portee;
            int chargeur;
            int typeMunition;
            char definition[1000];
    };




    listeArme.txt



    {5}
    {00}{pistolet 10mm}{00}{00}{5}{12}{25}{12}{17}
    {Vous ne devrez vous humilier à le porter qu'au tout début du jeu.}
    {01}{pistolet laser}{02}{01}{10}{22}{35}{12}{03}
    {Un petit pistolet sympa mais sans grand intérêt. Les dégâts n'égalent pas une bonne arme légère.}
    {02}{fusil de chasse}{00}{00}{12}{22}{14}{2}{11}
    {Assez frustrant pour une portée minable et un flingue à recharger tous les 2 coups! On sauve avec le fait qu'il soit précis et (un peu) puissant.}
    {3}{minigun}{01}{00}{7}{11}{35}{120}{14}
    {Il fait très mal, c'est évident. Même si les dégâts sont identiques à ceux de FO1, on en ressent dans le 2 très vite les limites, ce qui force à passer à des armes plus dévastatrices...}
    {04}{fusil a turbo-plasma}{02}{03}{30}{65}{25}{10}{04}
    {Le fusil parfait. Précis, bien plus puissant, et seulement 4 PA pour tirer! Avec Bonus cadence de tir et 9 PA, on peut s'en servir 3 fois par tour!! Les coups critique peuvent dépasser 200 points de dégâts!}



    ressources.txt



    00=normal
    01=laser
    02=feu
    03=plasma
    04=électrique
    05=emp
    06=explosion.


    Liste des types de munition

    00=aucun
    01=roquette
    02=combu lance flamme
    03=petite cellule énergétique
    04=cellule à micro fusion
    05=BB
    06=hn needler
    07=.223
    08=.45
    09=.44
    10=.40
    11=.12
    12=2mm
    13=4.7mm
    14=5mm
    15=7.62mm
    16=9mm
    17=10mm
    18=14mm

    Comment sont enregistré les armes ?
    {Nombre d'armes dans le fichier}
    {id de l'arme}{nom de l'arme}{Type de l'arme}{type de degat}{degat minimum}{degat maximum}{portée}{chargeur}{type des muintions}
    {definition de l'arme}

    EXEMPLE :
    {1}
    {00}{pistolet 10mm}{00}{00}{5}{12}{25}{12}{17}
    {Vous ne devrez vous humilier à le porter qu'au tout début du jeu.}

    signifie :
    L'arme n°0, le pistolet, est une arme à legere qui fais des degats normaux.
    Ils vont de 5 à 12 points de vie.
    Le pistolet as une portée de 25 metres et as un chargeur de 12 balles de calibre 10mm.
    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2006 à 11:40:30

      Devant les noms de tous les variables qui vont contenir des entiers, dans un scanf, tu dois mettre un &, pour indiquer l'adresse mémoire.

      Les noms des variables de type char [] (des chaines de caractères) restent inchangés, puisque ce sont déja des pointeurs. Par contre, pour les scanner ce n'est pas %ld mais %s. De plus, comme tu ne veux pas un mot, mais tout ce qui est entre { et }, je te conseille d'utiliser %[^}].

      Par exemple, la première ligne de scan devient :
      fscanf(fichier, "{%ld}{%[^}]}{%ld}", &Armes[i].id, Armes[i].nom, &Armes[i].type);


      Je te laisse corriger par toi même le reste des scanf.
      • Partager sur Facebook
      • Partager sur Twitter
        20 avril 2006 à 13:43:29

        Citation : bluestorm

        Par exemple, la première ligne de scan devient :

        fscanf(fichier, "{%ld}{%[^}]}{%ld}", &Armes[i].id, Armes[i].nom, &Armes[i].type);



        Et il faut tester la valeur retournée par fscanf() (EOF, nombre de conversions réussies etc.)
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          20 avril 2006 à 14:09:35

          bluestorm :
          MERCI BEAUCOUP !!!
          Mais je n'aime pas ecrire ce que je ne sais pas lire, donc est ce que tu pourrais m'expliquer pourquoi utiliser '%[^}]' plutôt que '%s' ?
          Au fait, j'y avais pensé avant, c'est juste que ça m'est sortis de la tête lorsque j'ai fais copié-collé

          -ed- :
          Non, je sais combien de fois je dois faire ma boucle grace à ma variable 'nbArme'

          Voici mon nouveau code de "main.c"


          /*
          main.c
          ------------

          Par Kl3M, pour Fallout3

          Rôle : Lis un fichier de stockage des informations concernant les armes,
                 et restitue ces informations
          */

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

          void lireFichier (int *nbArme, Arme Armes[]);

          main (int argv, char* argc[])
          {
                  //declaration des variables
                  Arme Armes[10];
                  int nbArme = 0, i;
                         
                  //Entrée dans les fichier       
                  lireFichier (&nbArme, Armes[]); //NE CHERCHEZ PLUS, C'EST ICI LA FAMEUSE LIGNE 23
                 
                  //Verification
                  for(i ; i < nbArme ; i++)
                  {
                          printf("\nnom : %s\n", Armes[i].nom);
                          printf("\ttype : %ld\n", Armes[i].type);
                          printf("\tdegat : %ld, %ld-%ld\n", Armes[i].typeDgt, Armes[i].dgtMin, Armes[i].dgtMax);
                          printf("\tportee : %ld\n", Armes[i].portee);
                          printf("\tchargeur : %ld\n", Armes[i].chargeur);
                          printf("\tmunitions : %ld\n", Armes[i].typeMunition);
                          printf("\tdefinition : %s\n", Armes[i].definition);
                  }
          }

          void lireFichier (int *nbArme, Arme Armes[])
          {
                  //declaration des variables
                  FILE *fichier = NULL;
                  int i = 0;
                 
                  fichier = fopen ("listeArmes.txt", "r");
                 
                  fscanf(fichier, "{%ld}\n", nbArme);
                 
                  for (i = 0 ; i < *nbArme ; i++)
                  {
                  //fscanf(fichier, "{%ld}{%ld}{%ld}", Armes[i]->id, Armes[i]->nom, Armes[i]->type);
                  //fscanf(fichier, "{%ld}{%ld}{%ld}", Armes[i]->typeDgt, Armes[i]->dgtMin, Armes[i]->dgtMax);
                  //fscanf(fichier, "{%ld}{%ld}{%ld}\n", Armes[i]->portee, Armes[i]->chargeur, Armes[i]->typeMunition);
                  //fscanf(fichier, "{%ld}\n", Armes[i]->definition);
                  fscanf(fichier, "{%ld}{%[^}]}{%ld}", &Armes[i].id, Armes[i].nom, &Armes[i].type);
                  fscanf(fichier, "{%ld}{%ld}{%ld}", &Armes[i].typeDgt, &Armes[i].dgtMin, &Armes[i].dgtMax);
                  fscanf(fichier, "{%ld}{%ld}{%ld}\n", &Armes[i].portee, &Armes[i].chargeur, &Armes[i].typeMunition);
                  fscanf(fichier, "{%[^}]}\n", Armes[i].definition);
              }
                 
                  fclose(fichier);
          }




          Losque je compile, le compilateur me dit :
          ligne Fichier Message
          23 ******* Syntax error before ']' token
          • Partager sur Facebook
          • Partager sur Twitter
            20 avril 2006 à 14:13:40

            Tu aurais pu nous indiquier la ligne 23 hein, j'ai du compter en partant du début :p

            lireFichier (&nbArme, Armes[]);

            Ils font quoi les [] après Armes ? Vire les.
            • Partager sur Facebook
            • Partager sur Twitter
              20 avril 2006 à 14:15:42

              ooops, j'ai vus mon erreur en validant le message...
              c'est bon, j'ai rectifier !!!
              Non, Armes est un tableau

              EDIT [QUELQUES MINUTES PLUS TARD]
              J'ai enlevé pour voir, et ça marche !!!
              Merci !!!

              Mais pourquoi ne faud il pas mettre les accolades ?
              Je ne comprend pas du tout

              ET pour les '%[^}]' ?
              • Partager sur Facebook
              • Partager sur Twitter
                20 avril 2006 à 14:25:11

                Ben tu devrais relire le chapitre sur les tableaux.

                %[^}] c'est une expression rationelle, qui veut dire "tout ce qui est différent de }, je le met dans la chaine, et je m'arrête quand je rencontre un }" (si tu fais du PHP, tu as peut-être lu le chapitre sur les regexp, et bien c'en est nue).
                • Partager sur Facebook
                • Partager sur Twitter
                  20 avril 2006 à 14:29:08

                  Mais si je veut, je peut quand même mettre %s, non ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 avril 2006 à 14:36:26

                    Citation : Kl3M


                    -ed- :
                    Non, je sais combien de fois je dois faire ma boucle grace à ma variable 'nbArme'


                    Et si le fichier n'est pas celui que tu attends, il se passe quoi ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      20 avril 2006 à 14:44:39

                      Si le fichier n'est pas celui que j'attend, la console affichera...rien

                      Mais y a pas de raison !!!
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 avril 2006 à 14:45:56

                        Citation : -ed-

                        Et si le fichier n'est pas celui que tu attends, il se passe quoi ?

                        Ca bug :p

                        Rien est prévu si il y a un autre fichier, faudrait prévoir... :-°
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 avril 2006 à 14:54:32


                                  FILE *fichier = NULL;
                                  int i = 0;
                                 
                                  fichier = fopen ("listeArmes.txt", "r");
                                 
                                  if ( fichier == NULL )
                                  {
                                  printf("J'ai le regret de vous informer que je vais vous laisser comme un idiot devant une fenetre vide\n");
                                  return 0;
                              }
                                 
                                  fscanf(fichier, "{%ld}\n", nbArme);
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 avril 2006 à 14:56:49

                            C'est génial ça :lol: :
                            "J'ai le regret de vous informer que je vais vous laisser comme un idiot devant une fenetre vide"

                            Oui, maintenant c'est prévu ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 avril 2006 à 14:56:50

                              Citation : Kl3M

                              Si le fichier n'est pas celui que j'attend, la console affichera...rien

                              Mais y a pas de raison !!!


                              Je parle de la structure du fichier (lignes en plus ou en moins, données ou séparateurs manquants...) Absolument tout peut arriver.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                20 avril 2006 à 14:58:46

                                Oui, maintenant, comme l'a dit -ed- , tu devrais faire un 'vérificateur' de fichier ''listeArmes.txt'' ;)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 avril 2006 à 15:04:40

                                  Je prévois de faire un 'ecriveur' de données.
                                  Donc, si tout est bien codé, pas besion de verifier
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    20 avril 2006 à 15:08:06

                                    Citation : Kl3M

                                    Je prévois de faire un 'ecriveur' de données.
                                    Donc, si tout est bien codé, pas besion de verifier


                                    Ca ne suffit pas. Tout peut arriver (fichier renommé, altéré, erroné en phase de debug...). Et de toutes façons, c'est un principe de base de Bonne Conception. Un programme ne dois pas planter sur des entrées aléatoires...

                                    Tu es prévenu, tu fais ce que tu veux...

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !
                                      20 avril 2006 à 15:10:06

                                      Sir Yes Sir !!!
                                      ...
                                      ...
                                      ...
                                      ...
                                      <mode jAiLAirDUnGrosIdiot 'on'>Et comment je fais ?</mode>
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        20 avril 2006 à 15:21:41

                                        Tu vérifie par exemple qu'il y a un nombre déterminée de {}, que se sont bien des chiffres qu'il y a entre les {}, etc. ;)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 avril 2006 à 15:22:27

                                          Citation : Kl3M

                                          Et comment je fais ?


                                          Déjà expliqué

                                          http://www.siteduzero.com/forum-83-34360-258758.html#r258758

                                          succintement, le reste dans ton livre de C ou ici :

                                          http://dpobel.free.fr/man/html/index.php?section=3
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Music only !
                                            20 avril 2006 à 15:47:17

                                            Désolé pour KlM3 :-° c'est Kl3M ;)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              20 avril 2006 à 16:46:01

                                              ah, je me disais aussi, aucun KlM3 que je connaisse !!!
                                              :)

                                              Non, c'est pas grave
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              [C] Erreurs introuvables

                                              × 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