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