Salut,
j'ai une erreur de segmentation dans un programme que je dois remanier. Je m'explique :
les parties du programme en question qui nous intéresse sont :
un lexer : lex_gramm.y
un analyseur syntaxique : yacc-gramm.y
une classe Table : Table.cc
un fichier d'entrée : MouseModel.csv qui contient, entre autres, des paramètres.
Le lexer lit le fichier d'entrée et le "découpe" en sortes de mots : les tokens.
L'analyseur syntaxique utilise les token pour analyser la structure du fichier et génére en conséquence les actions qu'il faut.
J'ai rajouté des paramètres au fichier d'entrée, au lexer et à l'analyseur syntaxique et depuis j'ai une erreur de segmentation. Voici les bouts de code utile :
lex_gramm.y :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
//....
 "AP_Type"				 yylval.chaine=new string(yytext);return (APTYPE);
"Pos_ES"				 yylval.chaine=new string(yytext);return (POSES);
 
"Cycle_Length"			 yylval.chaine=new string(yytext);return (CYCLELENGTH);
"Rest_Interval"			 yylval.chaine=new string(yytext);return (RESTINTERVAL);
"Varmaxmax"				 yylval.chaine=new string(yytext);return (VARMAXMAX);
"Num_ES"				 yylval.chaine=new string(yytext);return (NUMES);
"Num_APs"				 yylval.chaine=new string(yytext);return (NUMAPS);
"Stim_Duration"			 yylval.chaine=new string(yytext);return (STIMDURATION);
"Stim_Value"			 yylval.chaine=new string(yytext);return (STIMVALUE);
"stepsize"				 yylval.chaine=new string(yytext);return (STEPSIZE);
"step_min"               yylval.chaine=new string(yytext);return (STEPMIN);
"step_max"               yylval.chaine=new string(yytext);return (STEPMAX);
"statesize"				 yylval.chaine=new string(yytext);return (STATESIZE);
"reltol"                 yylval.chaine=new string(yytext);return (RELTOL);
"abstol"                 yylval.chaine=new string(yytext);return (ABSTOL);
// Les 6 derniers paramètres on été rajoutés
//....
yacc_gramm.y:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//...
%token <chaine> APTYPE POSES TSTEP CYCLELENGTH RESTINTERVAL VARMAXMAX NUMES NUMAPS STIMDURATION STIMVALUE STEPSIZE STEPMIN STEPMAX STATESIZE RELTOL ABSTOL
// les 6 derniers paramètres ont été rajoutés
//...
%%

//regle principale, qui sera executee quand tout le fichier aura ete parcouru
fichier:
PARAMSIMUL parametres CONSTANTES constantes 
DEFPOTENTIEL DIFFV expr MAXIMAV IDENTIFICATEUR nombre  MINIMAV IDENTIFICATEUR nombre IDENTIFICATEUR expr   
canal NOMFICHIERSORTIE IDENTIFICATEUR FREQUENCE NOMBRE LISTE listeEcriture EOF { 
	try {//...
if(*$14 != "Itotal") throw ExceptionGramm ("Veuillez donner l'expression de Itotal dans la section definition de V et Itotal");
		Table* tbv=new  Table();
		tbv->SetSymbole("V",$4->GetValeur("V"));
		Table* tbi=new  Table();
		tbi->SetSymbole("Itotal",0);
		$4->Ajoute($2);/* C'est cette instruction qui provoque l'erreur de segmentation quand on rajoute des paramètres*/
	Simulateur*  sim= new Simulateur($4,new ExprDiff((string)"V",new Tree($7),tbv),new ExprPol((string)"Itotal", new Tree($15),tbi),$16,*$18,*$22,$20);		
	}
	catch(ExceptionGramm e){//...
}
//...
parametres :
APTYPE		nombre 
POSES		 nombre   
CYCLELENGTH        nombre   
RESTINTERVAL	 nombre  
VARMAXMAX          nombre  
NUMES		 nombre  
NUMAPS		 nombre  
STIMDURATION     nombre 
STIMVALUE		nombre
STEPSIZE		nombre
STEPMIN		nombre
STEPMAX		nombre
STATESIZE		nombre
RELTOL		nombre
ABSTOL		nombre
{	$$  =new Table();
	$$->SetSymbole(*$1, $2);
	$$->SetSymbole(*$3, $4);
	$$->SetSymbole(*$5, $6);
	$$->SetSymbole(*$7, $8);
	$$->SetSymbole(*$9, $10);
	$$->SetSymbole(*$11, $12);
	$$->SetSymbole(*$13, $14);
	$$->SetSymbole(*$15, $16);
	$$->SetSymbole(*$17, $18);
	$$->SetSymbole(*$19, $20);
	$$->SetSymbole(*$21, $22);
	$$->SetSymbole(*$23, $24);
	$$->SetSymbole(*$25, $26);
	$$->SetSymbole(*$27, $28);
	$$->SetSymbole(*$29, $30);
      //Les fonctions de 19 à 30 servent à remplir une table avec les nouveaux paramètres
	
//...
	
	FILE * p= e.ouvrir("parametres.h");
	e.ecrire_entete(p,"fichier de definition des parametres du simulateur ");
	e.ecrire_const(p, *$1,$2);
	e.ecrire_const(p, *$3,$4);
	e.ecrire_const(p, *$5,$6);
	e.ecrire_const(p, *$7,$8);
	e.ecrire_const(p, *$9,$10);
	e.ecrire_const(p, *$11,$12);
	e.ecrire_const(p, *$13,$14);
	e.ecrire_const(p, *$15,$16);
	e.ecrire_const(p, *$17,$18);
	e.ecrire_const(p, *$19,$20);
	e.ecrire_const(p, *$21,$22);
	e.ecrire_const(p, *$23,$24);
	e.ecrire_const(p, *$25,$26);
	e.ecrire_const(p, *$27,$28);
	e.ecrire_const(p, *$29,$30);
	//Les fonctions de 19 à 30 servent à écrire les nouveaux paramètres dans le fichier parametres.h
	e.fermer(p);
}
//...
Table.cc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
void Table::Ajoute(Table* t){
	map<string , double>::iterator it2 = t->GetTable().begin();
	while(it2!= t->GetTable().end() ){
		_table[it2->first]=it2->second;
		it2 ++;
	}
}
Voilà, je n'ai mis que les parties qui me semblent utiles, mais peut-être qu'en ayant les fichiers en entier vous auriez une meilleure idée de ce qui cloche. Si c'est le cas dites le moi et je les mettrai en pièce-jointe.