Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur de segmentation dans un parser

    16 août 2007 à 21:10:44

    Es tu sûr que $4 est bien alloué à la ligne en question ?

    Que donne un cout << $4 << endl; à cet endroit ?
    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2007 à 10:02:31

      J'ai une adresse mémoire, je ne sais pas comment faire pour avoir la valeur.
      • Partager sur Facebook
      • Partager sur Twitter
        17 août 2007 à 10:04:00

        --> Debugueur.
        Ne jamais sous estimer cet outil magnifique :)
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          17 août 2007 à 20:30:00

          1. cout << *$4 << endl;
          ?
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            17 août 2007 à 22:18:46

            c'est une des variables crée par lex/yacc.
            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2007 à 13:30:05

              @ Fvirtman :
              J'ai essayé d'utiliser un debugger mais comme le programme est en 2 parties c'est assez compliqué.
              Comme je l'ai dit, je dois le modifier, ce n'est pas moi qui l'ai créé. La personne qui l'a fait a créé un makefile pour compiler les classes grâce à la commande make. Ensuite on tape une commande qui exécute les fichiers contenant ces classes et qui lit un fichier d'entrée : c'est là que j'ai une erreur de segmentation, donc je ne vois pas comment faire pour utiliser un debugger. Quand on exécute le programme les classes précédemment compilées lisent le fichier d'entrée et écrivent d'autres fichiers, qui constituent en quelque sorte le programme final, en fonction de ce fichier d'entrée. On compile ensuite les nouveaux fichiers créés et on les exécute.
              Voilà, c'est un peu compliqué. Vu que c'est à la 1ère exécution que j'ai l'erreur et je ne sais pas comment faire pour utiliser le débugger à ce niveau (d'habitude c'est plutot à la compilation que les erreurs surviennent), surtout que j'utilise make avant. Je vais essayer de passer par la commande de compilation traditionnelle en utilisant l'option de débuggage -g comme suit :
              g++ -g test.cpp -o test
              gdb ./test

              Je vous tient au courant.

              @ MatteX :
              J'ai essayé avec l'étoile mais ça me donne une erreur.

              @ Davidbrcz :
              est-ce que c'est une question ?? Je vois pas trop quoi répondre à ça à part que les $x correspondent aux numéros des tokens de la règle. Par exemple, dans
              1. $4->Ajoute($2);

              $4 correspond à constantes et $2 à paramètres de la règle fichier
              • Partager sur Facebook
              • Partager sur Twitter
                18 août 2007 à 19:08:22

                Il te suffit de modifier le makefile pour qu'il ajoute le -g à la compilation.

                Sans le débuggueur, cela me paraît compliqué à résoudre.

                P.S.: Skyre Mortalis ?
                • Partager sur Facebook
                • Partager sur Twitter
                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                  19 août 2007 à 18:33:22

                  @Nanoc :
                  effectivement, c'était tellement simple que je n'y avais même pas pensé !! Donc c'est ce que j'ai fait et ça marche bien. Le seul problème c'est que je ne sais pas utiliser un debugger aussi bien que je le pensais !! Je n'ai jamais utilsé les options qu'il contient. Je ne l'utilise que lorsque j'ai une erreur de segmentation pour savoir où elle se produit, sans savoir vraiment ce qui cloche. Je vais donc chercher de la doc là-dessus et si quelqu'un maîtrise le debugger gdb je veux bien qu'il me donne ses sources :p !!
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 août 2007 à 20:01:21

                    @ Davidbrcz :
                    merci ! et en plus c'est en français lol !

                    J'ai fait des petites recherches de mon côté et je suis tombée sur un bon site, assez complet d'après ce que j'ai pu voir et in english of course : debugging with gdb
                    Moi je voudrais simplement afficher le contenu de la variable x, mais j'ai l'erreur :
                    No symbol "x" in current context.

                    Dans mon super cours ils expliquent qu'il est possible d'avoir cette ereur et comment la résoudre : apparemment il faudrait éviter de "compiler les optimisations", si j'ai bien compris. Mais le problème c'est que je ne sais pas ce que c'est que les optimisations. Voici la page qui en parle : Program Variables
                    Si quelqu'un pouvait m'expliquer.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      19 août 2007 à 20:17:04

                      les optmisation , c'est les options en -0X ou x représente un chifffre entre 1 et 3
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 août 2007 à 20:39:52

                        @ Davidbrcz :

                        Citation : Davidbrcz


                        les optmisation , c'est les options en -0X ou x représente un chifffre entre 1 et 3


                        J'ai vu, toujours sur le même cours une explications de ce qu'étaient les optimisations. C'est sensiblement différent de ce que tu dis. Apparemment c'est représenté par, comme tu dis, l'option -o. Par exemple dans :
                        g++ -g test.cpp -o test

                        Mais ici il n'y a pas de chiffres. :euh:
                        J'ai essayé de compiler sans l'option -o, donc comme ça :
                        g++ -g test.cpp

                        J'ai un fichier a.out qui apparait et je l'exécute comme ça :
                        gdb ./a.out

                        Ensuite pour afficher le contenu de x qui est dans Main_simPA.cc je fais :
                        p 'Main_simPA.cc'::x

                        et ça ne marche pas car :
                        No symbol "x" in specified context.

                        Mais qu'est-ce qui cloche ?? J'ai bien enlevé l'option -o pourtant !!
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 août 2007 à 20:45:31

                          C'est pas l'option -o, mais les options -01,02,03,0s dont il parlait. Je pense que ici c'est potentiellement le -0s qu'il faut enlever encore que je doute.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                            19 août 2007 à 21:03:26

                            Je ne suis pas sûr que le débuggeur te seras d'une grande aide.
                            En effet, je pense pas que tu es trop envie de te plonger dans le code généré par bison...

                            Et sinon, t'as toujours pas répondu, cout << $4 << endl; , ça te donne quoi ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 août 2007 à 11:14:29

                              @Nanoc : je n'ai pas de -0s ni de -01,02,03.

                              @Antartika : si j'avais répondu :
                              cout << $4 << endl; me donne une adresse mémoire et
                              cout << *$4 << endl; me donne une erreur.
                              A part passer par le debugger pour savoir ce qui cloche, je ne vois pas quoi faire. D'autant plus que ce n'est pas bison qui déconne mais l'instruction $4->Ajoute($2); (voir mon 1er post)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 août 2007 à 20:24:38

                                Ok j'avais pas compris ton 2eme post.

                                Pour cout << *$4 << endl; c'est une erreur à la compile ?
                                Dans ce cas c'est normal (probablement pas de surcharge de << pour l'objet en question).

                                Au même endroit que te donne un cout << $2 << endl; ?

                                Ta classe Table est elle bien faite pour acceuillir des données en plus ?
                                Peut on avoir Table.h ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 août 2007 à 11:19:21

                                  @ Antartika :
                                  cout << $2 << endl;
                                  me donne également une adresse mémoire et
                                  cout << *$2 << endl;
                                  une erreur.

                                  Citation : Antartika

                                  Ta classe Table est elle bien faite pour acceuillir des données en plus ?


                                  J'ai l'impression que oui, mais je n'en suis pas sûre.

                                  Citation : Antartika

                                  Peut on avoir Table.h ?


                                  La voilà :
                                  1. #pragma once
                                  2. #include <map>
                                  3. #include <string>
                                  4. using namespace std;
                                  5. /**
                                  6.         classe qui modélise une table de symboles
                                  7.         où à chaque symbole est associé une valeur
                                  8. */
                                  9. class Table{
                                  10.         private :
                                  11.         ///la table des symboles faite de couples string-double
                                  12.                 map<string,double> _table;
                                  13.         public :
                                  14.         ///constructeur par défaut
                                  15.                 Table();
                                  16.         ///constructeur par recopie
                                  17.                 Table(const Table& t);
                                  18.         ///acces à la map
                                  19.                 map<string,double> GetTable();
                                  20.         ///acces à la valeur d'un symbole
                                  21.                 double GetValeur(string n);
                                  22.         ///change la valeur d'un symbole
                                  23.                 bool SetSymbole(string nom, double valeur);
                                  24.         ///teste la présence d'un symbole
                                  25.                 bool Appartient(string nom);
                                  26.         ///supprime un symbole de la table
                                  27.                 void Supprimer(string nom);
                                  28.         ///Ajoute les elements d'une autre table
                                  29.                 void Ajoute(Table* t);
                                  30.         ///affichage de la table
                                  31.                 void Afficher();
                                  32. };

                                  Je rappelle au cas où, que Table.cc est dans mon 1er post.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 août 2007 à 20:31:42

                                    Bon et bien on a une méthode pour afficher le contenu d'une table...
                                    Donc au lieu de faire du cout, tu fais :

                                    $4->Afficher();
                                    $2->Afficher();

                                    Si ça plante avant d'afficher $4 tu inverses l'ordre pour voir si $2 marche.

                                    Si l'un plante tu peux en déduire que c'est cet objet qui pose probleme.
                                    Si aucun plante, alors c'est ta méthode Ajoute qui est foire...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      22 août 2007 à 11:43:08

                                      @ Antartika :
                                      Les 2 fonctionnent, voici ce que j'obtiens :
                                      table :
                                      cle:Acap        valeur:0.0001534
                                      cle:CMDN        valeur:50
                                      cle:CSQN        valeur:15000
                                      cle:Caout       valeur:1800
                                      cle:Cm  valeur:1
                                      cle:ECaL        valeur:63
                                      cle:Ecl valeur:-40
                                      cle:F   valeur:96.5
                                      cle:GCaL        valeur:0.1729
                                      cle:Gcl_ca      valeur:10
                                      cle:Gk1 valeur:0.2938
                                      cle:Gkr valeur:0.078
                                      cle:Gkrh        valeur:0.333333
                                      cle:Gks valeur:0.00575
                                      cle:GktoF       valeur:0.4067
                                      cle:GktoS       valeur:0
                                      cle:Gkto_ss     valeur:0.05
                                      cle:Gkur        valeur:0.16
                                      cle:Htrpn_tot   valeur:140
                                      cle:Itotal      valeur:0
                                      cle:K_minus_htrpn       valeur:3.2e-05
                                      cle:K_minus_ltrpn       valeur:0.0196
                                      cle:K_plus_htrpn        valeur:0.00237
                                      cle:K_plus_ltrpn        valeur:0.0327
                                      cle:Kaf valeur:0.006075
                                      cle:Kar valeur:0.07125
                                      cle:Kb  valeur:0.036778
                                      cle:Kbf valeur:0.00405
                                      cle:Kbr valeur:0.965
                                      cle:Kcf valeur:0.009
                                      cle:Kcr valeur:0.0008
                                      cle:Kf  valeur:0.023761
                                      cle:KmCl        valeur:10
                                      cle:Km_CMDN     valeur:0.238
                                      cle:Km_CSQN     valeur:800
                                      cle:Km_up       valeur:0.5
                                      cle:Kout        valeur:5400
                                      cle:Kpcb        valeur:0.0005
                                      cle:Kpchalf     valeur:20
                                      cle:Kpcmax      valeur:0.23324
                                      cle:L   valeur:0.01
                                      cle:Ltrpn_tot   valeur:70
                                      cle:M   valeur:3
                                      cle:N   valeur:4
                                      cle:Naout       valeur:140000
                                      cle:Pi  valeur:3.14
                                      cle:R   valeur:8.314
                                      cle:Rad valeur:0.0011
                                      cle:T   valeur:298
                                      cle:Tautr       valeur:20
                                      cle:Tauxfer     valeur:8
                                      cle:V   valeur:-82.4202
                                      cle:V1  valeur:4.5
                                      cle:V2  valeur:1.74e-05
                                      cle:V3  valeur:0.45
                                      cle:Vcell       valeur:3.8e-05
                                      cle:Vjsr        valeur:1.2e-07
                                      cle:Vmyo        valeur:2.584e-05
                                      cle:Vnsr        valeur:2.098e-06
                                      cle:Vss valeur:1.49e-09
                                      cle:iCaLmax     valeur:7
                                      cle:racine      valeur:0
                                      table :
                                      cle:AP_Type     valeur:2
                                      cle:Cycle_Length        valeur:100
                                      cle:Num_APs     valeur:100
                                      cle:Num_ES      valeur:100
                                      cle:Pos_ES      valeur:15
                                      cle:Rest_Interval       valeur:100
                                      cle:Stim_Duration       valeur:0.5
                                      cle:Stim_Value  valeur:-80
                                      cle:Varmaxmax   valeur:0.0001
                                      cle:abstol      valeur:1e-12
                                      cle:racine      valeur:0
                                      cle:reltol      valeur:0.0001
                                      cle:statesize   valeur:53
                                      cle:step_max    valeur:0.4
                                      cle:step_min    valeur:1e-15
                                      cle:stepsize    valeur:0.1

                                      D'abord la tables des constantes et ensuite celle des paramètres.
                                      Donc, d'après toi, c'est Ajoute( ) qui pose problème ... :euh: Comme c'est une erreur de segmentation, il faudrait peut-être que je crée une table dynamiquement pour y mettre les paramètres anciens et nouveaux ?? T'en penses quoi ?? En tout cas j'essaye et je te dis le résultat ensuite.

                                      Edit : Le prototype de Ajoute( ) étant :
                                      1. Ajoute(Table* t)

                                      je pensais qu'en déclarant t dynamiquement ça marcherait mieux, mais non. Que faire ?? c'est peut-être _table (toujours dans la fonction Ajoute( )) qu'il faut déclarer dynamiquement ??
                                      Quelqu'un a une idée, parce que moi je sèche :euh::euh:
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      erreur de segmentation dans un parser

                                      × 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