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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 8
    Points
    8
    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
    Points : 16 075
    Points
    16 075
    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
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 8
    Points
    8
    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
    Points : 16 075
    Points
    16 075
    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
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 8
    Points
    8
    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);

  7. #7
    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
    Points : 16 075
    Points
    16 075
    Par défaut
    et si tu remontes la pile d'appel ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par nico-pyright(c)
    et si tu remontes la pile d'appel ?
    voila la pile d'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [External Code]	
    >	TP Compil - F2.exe!__tmainCRTStartup()  Line 586 + 0x19 bytes	C
     	TP Compil - F2.exe!mainCRTStartup()  Line 403	C
    et si je clicke sur le dernier element le la pile(TP Compil - F2.exe!mainCRTStartup() Line 403 C) j'obtiens ça .. toujours la fleche a la fin et dans le fichier crtexe.c
    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
     
    #ifdef WPRFLAG
    int wmainCRTStartup(
    #else  /* WPRFLAG */
    int mainCRTStartup(
    #endif  /* WPRFLAG */
     
    #endif  /* _WINMAIN_ */
            void
            )
    {
            /*
             * The /GS security cookie must be initialized before any exception
             * handling targetting the current image is registered.  No function
             * using exception handling can be called in the current image until
             * after __security_init_cookie has been called.
             */
            __security_init_cookie();
     
            return __tmainCRTStartup();
    }

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    bon on va dire que c'est résolu ... enfin non ya encore une heure j'avais toujours le meme bug ... et depuis les plus acharné geek de ma classe ont jetté un oeil dessus sans pouvoir m'aider... snif (que de temps perdu !)


    en fait j'ai tout repris depuis le début (ya une heure donc) en me mettant 100% dans du c++/cli (les classes avec "ref" youpi) puis en utilisant les objets crosoft :-) a la poubelle les "gcroot<....>" !

    je sais pas si ça va m'aider ... mais au moins j'aurais appris quelquechose d'utile avec ce TP de compil (c'est pas la compil :-))

    d'ailleurs ta FAQ est nickel Nico .. merci beaucoup

    et je promet que je serais fidele au c++ cli si j'arrive a finir ce tp avant la soutenance, c''est a dire demain :-) (ah oué faut faire un rapport aussi :-( )

+ 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, 11h30
  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, 23h51
  3. [TP]Runtime error 106 à l'exécution
    Par BlackTiger dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 25/01/2004, 22h50
  4. [LG]runtime error 202
    Par picsou123 dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2003, 23h53
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 12h51

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