Bonjours tout le monde ... voila encore un sujet pour reclamer votre aide !! (d�cid�ment le c++ manag� c'est pas mon fort)
Voila, je r�alise actuellement un TP de compilation pour la fac. J'ai choisi VC++, mais j'arrete pas de me confronter avec des soucis, etant habitu� a du c++ classique.
Voila mon soucis: j'ai une exception qui est lanc�e intempestivement ... et pas moyen de savoir d'ou �a vient (humm je sais pas trop comment utiliser le d�bogeur VS). Elle se produit alors que j'accede a un de mes 2 tableau a 2 dimensions.
a premiere vue, on pourrait croire qu'il s'agit d'un it�rateur mal g�r� ... sauf qu'en fonction des parametre que je passe a mon constructeur, �a passe ou pas. (par exemple �a peut marcher avec une taille de 2, et 3 �a pine ... a s'arracher les cheveux)
je commence a penser que je maitrise pas les initialisation avec les objets manag� ... si vous pouviez m'�clairer, voici le code (je ne met que les donn�es membres, le constructeur et la fonction afficher qui lance l'erreur sinon c'est trop long):
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 public class tableLalr { protected: action ** tableTerm; int ** tableNonTerm; int nb_symbolesT,nb_symbolesNT, nb_etats; gcroot <Hashtable ^> hashSymbT; gcroot <Hashtable ^> hashSymbNT; public: tableLalr(int nb_etat, array<System::String ^> ^symboleT, array<System::String ^> ^symboleNT) { //init tailles this->nb_etats = nb_etat; this->nb_symbolesT = symboleT->Length; this->nb_symbolesNT = symboleNT->Length; ///nb_symboleNT; //init du tableau des terminaux(pas trouvé mieux ...) this->tableTerm = new action *[this->nb_etats]; for(int i=0;i<this->nb_symbolesT;i++) { tableTerm[i]=new action[this->nb_symbolesT]; } //init du tableau des non terminaux this->tableNonTerm = new int * [this->nb_etats]; for(int i=0;i<this->nb_symbolesNT;i++) { this->tableNonTerm[i] = new int[this->nb_symbolesNT]; } // init des deux hashtables this->hashSymbT = gcnew System::Collections::Hashtable(); this->hashSymbNT = gcnew System::Collections::Hashtable(); for(int i=0;i<this->nb_symbolesT;i++){this->hashSymbT->Add(symboleT[i], i); } for(int i=0;i<this->nb_symbolesNT;i++){this->hashSymbNT->Add(symboleNT[i], i);} }//constructeur
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 public: void afficher() { Console::WriteLine("======= Table LALR ======= "); IDictionaryEnumerator ^a = this->hashSymbT->GetEnumerator(); Console::Write(" "); while(a->MoveNext()) { Console::Write("["+a->Key+"]"); } Console::WriteLine(); //Console::WriteLine(this->hashSymbT->GetEnumerator()->); //Terminaux for(int i = 0; i<this->nb_etats; i++) { Console::Write("Etat("+i+") -> "); for(int j = 0; j<(this->nb_symbolesT); j++) { Console::Write("["); if(!(this->tableTerm[i][j].isNull())){Console::Write(this->tableTerm[i][j].ToString());} else{Console::Write("-"); } Console::Write("]"); } Console::WriteLine(); } Console::WriteLine("==> Symboles Non terminaux"); //Non terminaux a = this->hashSymbNT->GetEnumerator(); Console::Write(" "); while(a->MoveNext()) { Console::Write("["+a->Key+"]"); } Console::WriteLine(); for(int i = 0; i<(this->nb_etats); i++) { Console::Write("Etat("+i+") -> "); for(int j = 0; j<(this->nb_symbolesNT); j++) { //Console::WriteLine("aaa "+j); Console::Write("["); if(this->tableNonTerm[i][j].Equals(NULL)){Console::Write(this->tableNonTerm[i][j].ToString());} else{Console::Write("-"); } Console::Write("]"); } Console::WriteLine(); } }et voila l'erreur ==>
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 int main(void) { action *a,*c, *d; a = new action(); c = new action(); d = new action(1,"$","d",3); array<String^> ^t1 = {"a", "b", "c", "d", "e"}; array<String^> ^t2 = {"x","y"}; /* param : int nombre d'etat, tableau de string de symbole terminaux, tableau de string de symbole non terminaux*/ tableLalr *b = new tableLalr(3,t1,t2); b->afficher(); return 0; }
et si je change l'appel du constructeur en mettant 2 etat au lieu de 3:
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 ======= Table LALR ======= [a][b][c][d][e] Etat(0) -> [-][-][-][-][-] Etat(1) -> [-][-][-][-][-] Etat(2) -> [-][-][-][-][-] ==> Symboles Non terminaux [x][y] Etat(0) -> [-][-] Etat(1) -> [-][-] Etat(2) -> [ Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at tableLalr.afficher(tableLalr* ) at main() Appuyez sur une touche pour continuer...
eh bien �a marche nickel ....
Code : S�lectionner tout - Visualiser dans une fen�tre � part tableLalr *b = new tableLalr(2,t1,t2);
voila a n'y rien comprendre !!! pour quoi �a marcherais avec 2 etats et pas 3 ??? et en plus c'est variable .. hier �a marchais avec 1, 3, 4 ... etat et pas 2 !!! c'est a n'y rien comprendre ...
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10 ======= Table LALR ======= [a][b][c][d][e] Etat(0) -> [-][-][-][-][-] Etat(1) -> [-][-][-][-][-] ==> Symboles Non terminaux [x][y] Etat(0) -> [-][-] Etat(1) -> [-][-] Appuyez sur une touche pour continuer...
j'ai le sentiment qu'il y a une subtilit� pour les initialisation que je ne maitrise pas ...
(ps: au passage... intellisense a tendence a bugger par moment chez moi... �a ralenti et je n'ai plus le curseur, apparament il s'agirait d'un probleme vis a vis de l'initialisation des tableau qu'il faudrai faire d'une maniere pr�cise pour que �a marche bien ... si qqun peut m'eclaire sur ce point la ausii merci d'avance)
(ps2: si vous avez des tips a me donner meme sur le code n'hesitez pas merci !!!)
pour info je suis sous VisualStudio 2005 e si vous avez la moindre question n'hesitez pas a me contacter sur msn ou skype (cf mon profil)
en vous remerciant d'avance
Partager