IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

[.Net][PB Runtime error] - AccessViolationException intempestive


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut [.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 : 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

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je te conseille d'essayer de debbugger pas à pas, tu mets un point d'arrets au début de ton code (F9), et tu navigues petit à petit avec la touche
    F11 dans les appels des fonctions.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    this->tableNonTerm CXX0017: Error: symbol "this" not found
    le fichier concerné est:
    crtexe.c

    comment interpéter ça ?
    étant donné que tableNonTerm est une variable membre de ma classe comment se fait t'il que "this" ne soit pas connu ?

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    pourquoi un .c et pas un .cpp ?

    (nb : this n'est adapté que si la partie de ton code est dans la classe)

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    Citation Envoyé par nico-pyright(c)
    pourquoi un .c et pas un .cpp ?
    si je le savais :-)

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Par défaut
    au debug une fleche verte pointe sur la derniere intruction de cette macro du fichier crtexe.c ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #else  /* WPRFLAG */
                __initenv = envp;
                mainret = main(argc, argv, envp);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Runtime error avec UDF/DLL
    Par pram dans le forum SQL
    Réponses: 6
    Dernier message: 22/04/2005, 10h30
  2. [LG]Runtime Error lors d'une recherche dans un fichier
    Par Fraynor dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2005, 22h51
  3. [TP]Runtime error 106 à l'exécution
    Par BlackTiger dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 25/01/2004, 21h50
  4. [LG]runtime error 202
    Par picsou123 dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2003, 22h53
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo