[.Net][PB Runtime error] - AccessViolationException intempestive
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:
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:
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();
}
} |
Code:
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 voila l'erreur ==>
Code:
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... |
et si je change l'appel du constructeur en mettant 2 etat au lieu de 3:
Code:
tableLalr *b = new tableLalr(2,t1,t2);
eh bien �a marche nickel ....
Code:
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... |
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 ...
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