@ 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
$4->Ajoute($2);
$4 correspond à constantes et $2 à paramètres de la règle fichier
@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 !!
@ 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.
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.
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 !!
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.
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 ?
@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)
@ 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 ... 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 :
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
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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html