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 :

Resoudre une exception


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut Resoudre une exception
    Bonjour,

    Je lance l'exécution avec débogage de mon programme C alors j'obtiens
    l'exception suivante:


    Exception non gérée à 0x00414d6b dans test.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xfeeefef2.

    Voici la trace de varibles:

    - ref 0xfeeefeee {reference=??? next=??? } REF *
    - reference CXX0030: Erreur : impossible d'évaluer l'expression
    - next CXX0030: Erreur : impossible d'évaluer l'expression

    Et comme structure de données j'utilise la liste chainée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct {
     
    	char* reference; // la donnée proprement dite
     
    	void* next;      // pointeur vers la reference suivante (ou 0 s'il n'y a plus de donnée) 
     
    } REF;



    Que proposez vous comme solution ?

    Merci.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut



    Hé bin il faudrait peut-être que tu nous donnes un peu plus de code. Un code complet réduit au minimum (s'il y a trop de lignes) et compilable, surtout sur l'initialisation/remplissage/lecture de ta liste chaînée !

    Mais à première vue, ce que je peut te dire, c'est que ta liste me semble bizarre Le pointeur suivant ne doit pas être de type void mais du type de ta structure par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct _REF {
     
    	char* reference; // la donnée proprement dite
     
    	struct _REF* next;      // pointeur vers la reference suivante (ou 0 s'il n'y a plus de donnée) 
     
    } REF;
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sous Windows, 0xfeeefeee indique une zone mémoire qui vient d'être libérée (par un free() ou équivalent).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    Le débogage gère l'exception dans la partie du fonction suivante :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    void characters(void* user_data, const xmlChar *ch, int len) {
     
    	if (_inID && len) {
     
    		// On va enregistrer l'ID, mais en supprimant les espaces qui semblent s'être introduits <ID> 5 </ID>
     
    		while(len>1 && *ch==32) {
     
    			len--;
     
    			ch+=sizeof(xmlChar);
     
    		}
     
     
     
    		// On supprime également les espaces qui suivent la valeur.
     
    		while(len>1 && *(ch+len-1)==32)
     
    			len--;
     
     
     
    		_concepts[_currentCpt].ID = (char*)malloc(len+1);
     
    		strncpy(_concepts[_currentCpt].ID, ch, len);
     
    		*(_concepts[_currentCpt].ID+len) = 0;
     
    		_inID = 0;
     
    	}
     
    	else if ((_inIntent || _inUpperCovers || _inExtent) && len)
     
    	{	
     
    		// lien vers les references du concept courant
     
    		REF** source;
     
    		REF* ref;
     
    		REF* newRef;
     
     
     
    		if (_inIntent)
     
    			source = &(_concepts[_currentCpt].intent);
     
    		else if (_inUpperCovers)
     
    			source = &(_concepts[_currentCpt].upperCovers);
     
    		else if (_inExtent)
     
    			source = &(_concepts[_currentCpt].extent);
     
     
     
    		ref = *source;
     
     
     
    		// on créé une nouvelle reference
     
    		newRef = (REF*)calloc(1, sizeof(REF));
     
     
     
    		// permet de relier la nouvelle reference a la structure (liste chainee)
     
    		if (ref) {
     
    			// La liste contient au moins une cellule.
     
    			// On va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à NULL)
     
    			while(ref->next)
     
    				ref = (REF*)ref->next;
     
    			ref->next = newRef;
     
    		}
     
    		else
     
    			*source = newRef; // Première cellule de la liste chainée
     
     
     
    		// on recopie la donnée
     
    		newRef->reference = (char*)malloc(len+1);
     
    		strncpy(newRef->reference, ch, len);
     
    		// 0 terminal de la chaine de caractères
     
    		*(newRef->reference+len) = 0;	
     
     
     
    		// Remise à 0 des flags de position
     
    		_inIntent = _inUpperCovers = _inExtent = 0;
     
    	}
     
    }
    Et exactement le flèche jaune pointe sur l'instruction suivante :

    qui fait partie du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (ref) {
     
    			// la liste contient au moins une cellule.
     
    			// on va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à null)
    while(ref->next)
    	ref = (ref*)ref->next;
    	ref->next = newref;
     
    }
    Que proposez vous comme solution ?

    Merci.

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,
    Mon programme est en C sous Visual Studio 2008.

    J'ai remplacé ma ancienne structure de liste par la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct REF {
     
    char* reference; // la donnée proprement dite
    struct REF* next; // pointeur vers la reference suivante (ou 0 s'il n'y a plus de donnée) 
    }REF;
    L'exécution ne se termine pas correctement et lorsque je lance l'exécution avec débogage J'ai la même exception:

    Exception de première chance à 0x00414e1b dans chabnasri.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xfeeefef2.
    Exception non gérée à 0x00414e1b dans test.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xfeeefef2.
    Voici la trace de varibles:
    - ref 0xfeeefeee {reference=??? next=??? } REF *
    - reference CXX0030: Erreur : impossible d'évaluer l'expression
    - next CXX0030: Erreur : impossible
    Et exactement le flèche jaune pointe sur l'instruction suivante comme j'ai décrit ceci au dessus:

    Donc, la structure de liste n'est pas la cause de cette exception.

    concernant l'exception 0xfeeefeee:
    Sous Windows, 0xfeeefeee indique une zone mémoire qui vient d'être libérée (par un free() ou équivalent).

    Dans google, Je trouve cette information sur 0xfeeefeee:

    Il est souvent utile de connaitre le code de memoire en mode debug.
    Bien souvent les problemes de bases en C++ sont lie a la manipulation de la memoire (pointer NULL, non initialise, variable effacee mais reutilisee…).
    Ceux a connaitre par coeur sont 0xcdcdcdcd qui veut dire non initalise et 0xfeeefeee qui veut dire deja efface.

    Voici le lien:
    http://jeremy.chatelaine.name/blog/p...t-du-debuggage

    Je souhaite que vous m'aidez.

    Merci.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par siempre Voir le message
    Et exactement le flèche jaune pointe sur l'instruction suivante :

    qui fait partie du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (ref) {
     
    			// la liste contient au moins une cellule.
     
    			// on va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à null)
    while(ref->next)
    	ref = (ref*)ref->next;
    	ref->next = newref;
     
    }
    A quel moment s'exécute ton exeption (au début, à la fin du parcours de la liste) ? Comment est initialisée ta liste avant même cette étape ? Est-tu sûr que le dernier pointeur possède la valeur NULL ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    J'ai regardé ton code très rapidement et je pense que tu ne mets pas à NULL le tout dernier noeud d'où ton erreur, tu devrais donc rajouter ceci :
    juste après ton allocation par exemple.

Discussions similaires

  1. error 80020009 une exception s'est produite
    Par Riouxe21 dans le forum ASP
    Réponses: 6
    Dernier message: 21/12/2004, 11h01
  2. erreur :"une exception s'est produite"
    Par leborg dans le forum ASP
    Réponses: 11
    Dernier message: 02/03/2004, 15h09
  3. [JSP] Affichage numéro de ligne d'une exception
    Par PhoneKilleR dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 23/09/2003, 14h59
  4. Réponses: 2
    Dernier message: 28/08/2003, 00h00
  5. Réponses: 3
    Dernier message: 01/11/2002, 14h30

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