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++ Discussion :

violation d'accès en release avec tinyXml


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2016
    Messages : 20
    Par défaut violation d'accès en release avec tinyXml
    Bonjour,
    je travaille sous c++ Builder et suis en train de faire un programme qui fait des recherches dans des fichiers xml. Pour cela j'utilise TinyXml.
    Je suis arrivé à terme de mon programme après test en débug.
    Une fois que j'essaie de le mettre en release mon programme fait une violation d'accès (vers un pointeur non nul) lors de la recherche.

    Cela se fait uniquement lorsque j'essaie de lire une valeur dans le fichier XML, (j'ai pu le vérifié à l'aide de MessageBox avant et après l'instruction).
    Apres recherche on m'a dit que cela venait d'une variable mal initialisée, mais ça ne vient pas de la (je ne pense pas être passé à coté de l'une d'elle).

    Avez-vous des pistes pour pouvoir m'expliquer ce qui ne va pas en release s'il vous plait ?
    Je vous joins le code provoquant mon 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
    16
    17
    18
    19
    20
    21
    22
    TiXmlDocument monFichier((path + fileName).c_str());
    	if(monFichier.LoadFile()){
    		TiXmlHandle monHandle(&monFichier);
    		monHandle = monHandle.FirstChildElement();
    
    		if (monHandle.ToElement() != NULL) {
    			maNode = monHandle.ToNode();
    			ParcourirNoeud(maNode);
    		} 
    
    
    void __fastcall ParserXml::ParcourirNoeud(TiXmlNode* NodeAParcourir, bool estDansLeParent){
    	bool dansLeNoeudParent = false;
    	while(NodeAParcourir){
    	//test
    		AnsiString nom, valeur;
    		ShowMessage("ok");
    		nom = NodeAParcourir->Value();
    		ShowMessage("et la ça bug");
    	//
    ....
    }
    Merci, bonne journée

  2. #2
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour,

    Est-ce que ça plante tout de suite après le premier "ok" ou bien après plusieurs "ok" ?
    Dans le premier cas, je n'ai pas de piste.
    Dans le deuxième cas, il faudrait qu'on voit le reste de la boucle while qui modifie sûrement NodeAParcourir (autrement, la condition du while n'aurait pas de sens).

  3. #3
    Membre actif
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2016
    Messages : 20
    Par défaut
    Merci pour ta réponse
    et oui malheureusement ça plante dès la 1ère itération ... Pourtant je fais des test sur le document, le handle et la node, à ne rien comprendre ...

    Pour te répondre ma boucle while a du sens. Je fais NextSibling(), si il n'y en a plus il devient NULL donc on sort de la boucle.
    Je mets l'essentiel de ma fonction (en enlevant les divers test que je fais sur la node qui ne la modifie pas pour autant).

    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
    void __fastcall ParserXml::ParcourirNoeud(TiXmlNode* NodeAParcourir, bool estDansLeParent){
    	bool dansLeNoeudParent = false;
    	while(NodeAParcourir){
    	//test
    		AnsiString nom, valeur;
    		ShowMessage("ok");
    		nom = NodeAParcourir->Value();
    		ShowMessage("ok");
    		if(NodeAParcourir->ToElement()->FirstAttribute())
    		valeur = NodeAParcourir->ToElement()->FirstAttribute()->Value();
    	//
    		if(!NodeAParcourir->NoChildren()){
    			ParcourirNoeud(NodeAParcourir->FirstChild(), estDansLeParent);
    		}
     
    		NodeAParcourir = NodeAParcourir->NextSibling();
    	}
    }

  4. #4
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Je ne sais pas ce qui a fait crasher le programme.
    Cependant, je vois que tu oublies de tester que ToElement() retourne un pointeur non nul.

    Voici une autre version du code de ta fonction ParcourirNoeud :
    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
    void __fastcall ParserXml::ParcourirNoeud(const TiXmlNode& PremierNoeud, bool estDansLeParent)
    {
    	bool dansLeNoeudParent = false;
    	for(const TiXmlNode* NodeAParcourir = &PremierNoeud;
    	    NodeAParcourir != NULL;
    	    NodeAParcourir = NodeAParcourir->NextSibling())
    	{
    	//test
    		ShowMessage("ok");
    		AnsiString nom = NodeAParcourir->Value();
    		ShowMessage("ok");
    		AnsiString valeur;
    		const TiXmlElement* element = NodeAParcourir->ToElement();
    		if(element) {
    			const TiXmlAttribute* attribut = element->FirstAttribute();
    			if(attribut)
    				valeur = attribut->Value();
    		}
    	//
     
    		const TiXmlNode* premierEnfant = NodeAParcourir->FirstChild();
    		if(premierEnfant != NULL)
    			ParcourirNoeud(*premierEnfant, estDansLeParent);
    	}
    }

  5. #5
    Membre actif
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2016
    Messages : 20
    Par défaut
    J'ai testé ta solution mais cela a empiré mon cas. Maintenant ça plante même en débug lorsque l'on passe par :
    Citation Envoyé par Pyramidev Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		const TiXmlElement* element = NodeAParcourir->ToElement();
    		if(element) {
    			const TiXmlAttribute* attribut = element->FirstAttribute();
    			if(attribut)
    				valeur = attribut->Value();
    "valeur" contient des valeurs étonnantes, à la 1ère itération une flèche, à la seconde un carré puis à la 3eme plante...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Tu check que toElement fonctionne, puis le transformes en node avec toNode, puis retourne en element. C'est au mieux bancal
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. [TinyXML] Violation d'accès TXmlDocument
    Par moumout666 dans le forum XML
    Réponses: 0
    Dernier message: 21/10/2008, 11h05
  2. Violation d'accès avec activeX dans IE
    Par Eric Beaumard dans le forum Web & réseau
    Réponses: 1
    Dernier message: 12/09/2008, 20h08
  3. violation d'accès avec fenetre mdi
    Par rjuju dans le forum Delphi
    Réponses: 4
    Dernier message: 15/11/2006, 14h31
  4. Réponses: 1
    Dernier message: 02/08/2006, 17h37
  5. Violation d'accès avec les composants Word 97/ 2000
    Par edechaux dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/03/2006, 09h48

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