[.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