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();
            }
 
        }
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 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
======= 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 : Sélectionner tout - Visualiser dans une fenêtre à part
tableLalr *b = new tableLalr(2,t1,t2);
eh bien ça marche nickel ....
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...
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