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

Langage C++ Discussion :

Une erreur Fatale


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Par défaut Une erreur Fatale
    salut,
    jai essayé de programmer une pile chainée mais un fatal error apparait.ceci est mon code:

    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
     
    #include <iostream>
    using namespace std;
     
    struct cellule
    {
    	char donnee;
    	cellule *suivant;
    };
     
    class Pile 
    {
    private:
    	cellule *sommet;
    	cellule *debut;
    	int taille;
    public:
    	Pile();
    	void operator +(char donne);
    	void operator -();
    	//void Pile::afficher();
    };
     
    Pile::Pile()
    {
    	taille =0;
    	sommet =NULL;
    	debut=NULL;
    }
     
     
    void Pile::operator+(char donne)
    {
    	++taille;
    	if (taille==1)
    	{
    		debut=new cellule;
    		sommet=debut;
     
    		sommet->donnee=donne;
     
    	}
    	else 
    	{
    		sommet->suivant=new cellule;
    		sommet->donnee=donne;
    	}
    	sommet->suivant=NULL;
    }
     
    void Pile::operator -()
    {
    	cellule *p;
    	p=debut;
    	delete sommet;
    	while (p->suivant!=NULL)
    	{p=p->suivant;}
    	sommet=p;
    	delete p->suivant;
    	delete p; 
    	taille--;
    }
    quelqu'un peut m'aider????
    merci en avance.

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Alors, déjà, quand tu ajoutes un élément à ta pile, si ce n'est pas le premier, tu crées ta cellule que tu assignes au suivant du sommet, puis tu mets ce suivant à NULL => tu perds dans la nature la cellule que tu viens de créer.
    Ensuite, si j'ai bien compris, ton opérateur '-' est censé supprimer le sommet de ta pile. mais cet opérateur est l'opérateur de négation (parce qu'il n'y a pas de paramètre à la fonction). Il vaudrait mieux que tu te fasses une fonction SupprimerSommet.
    Enfin, cette même fonction fait n'importe quoi :
    - tu supprimes le sommet (jusqu'ici tout va bien),
    - tu récupères l'élément de fin de pile => l'ancien sommet que tu viens de supprimer et tu essaies d'accéder au membre 'suivant' d'une cellule supprimée => plantage
    - tu supprimes le suivant de cet élément => la cellule a été supprimée et tu essaies d'accéder à un de ses membres => plantage
    - tu supprimes cet élément => double delete => plantage, mais ton programme a planté avant et n'arrive même pas là.
    Tu as donc dans cette fonction 3 possibilités de plantage.

    Commence par réécrire tes fonctions d'insertion et de suppression sur papier, car j'ai l'impression que ce n'est pas clair dans ton esprit.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 23
    Par défaut
    Merci dragonjoker59
    des bonnes conseilles
    j'ai essayé de corriger mes erreurs apres verification.


    Citation Envoyé par dragonjoker59 Voir le message
    Alors, déjà, quand tu ajoutes un élément à ta pile, si ce n'est pas le premier, tu crées ta cellule que tu assignes au suivant du sommet, puis tu mets ce suivant à NULL => tu perds dans la nature la cellule que tu viens de créer.
    j'ai fait une faute grave.
    j'ai corrigé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    else 
    	{   
    		sommet->suivant=new cellule;
    		sommet=sommet->suivant;
    		sommet->donnee=donne;
    	}
    	sommet->suivant=NULL;
    j'espere que ca passe bien.
    Enfin, cette même fonction fait n'importe quoi :
    - tu supprimes le sommet (jusqu'ici tout va bien),
    - tu récupères l'élément de fin de pile => l'ancien sommet que tu viens de supprimer et tu essaies d'accéder au membre 'suivant' d'une cellule supprimée => plantage
    - tu supprimes le suivant de cet élément => la cellule a été supprimée et tu essaies d'accéder à un de ses membres => plantage
    - tu supprimes cet élément => double delete => plantage
    j'ai compris la premiere remarque ( tu supprimes le sommet
    - tu récupères l'élément de fin de pile => l'ancien sommet que tu viens de supprimer et tu essaies d'accéder au membre 'suivant' d'une cellule supprimée => plantage)
    et je l'ai corrigé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cellule *p;
    	p=debut;
    	while (p->suivant!=NULL)
    	{p=p->suivant;}
    	sommet=p;
    	delete p->suivant;
    	delete p;
    mais j'ai pas bien saisie (tu supprimes cet élément => double delete => plantage)
    est ce que ce pb est resolu maintenant??)
    en tout cas j ai pas utilisé la fonction void Pile::operator -() dans mon nouveau code et le pb reste tjr;
    mon nouveau code est :
    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
     
    #include <iostream>
    using namespace std;
     
    struct cellule
    {
    	char donnee;
    	cellule *suivant;
    };
     
    class Pile 
    {
    private:
    	cellule *sommet;
    	cellule *debut;
    	int taille;
    public:
    	Pile();
    	void operator +(char donne);
    	//void operator -();
     
    };
     
    Pile::Pile()
    {
    	taille;
    	sommet =NULL;
    	debut=NULL;
    }
     
     
    void Pile::operator+(char donne)
    {
    	++taille;
    	if (taille==1)
    	{
    		debut=new cellule;
    		sommet=debut;
     
    		sommet->donnee=donne;
     
    	}
    	else 
    	{   
    		sommet->suivant=new cellule;
    		sommet=sommet->suivant;
    		sommet->donnee=donne;
    	}
    	sommet->suivant=NULL;
    }
     
    /*void Pile::operator -()
    {
    	cellule *p;
    	p=debut;
    	while (p->suivant!=NULL)
    	{p=p->suivant;}
    	sommet=p;
    	delete p->suivant;
    	delete p;
    	taille--;
    }*/
    fatal error existe tjr
    merci pour votre aide

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Autres remarques : dans ton constructeur, tu n'initialises pas taille qui ne vaut donc pas 0 lors de la première insertion => tu passes dans ton 'else' et essaie d'accéder au membre 'suivant' de 'sommet' qui est nul => plantage.
    Ensuite, pour la suppression, je ferais ceci :
    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
     
    void Pile::Depiler()
    {
    	cellule * p;
    	p = debut;
    	sommet = NULL;
     
    	if (p != NULL)
    	{// on ne sait jamais ta pile peut être vide
    		while (p->suivant != NULL)
    		{
    			p = p->suivant;
     
    			if (p->suivant != NULL)
    			{
    				sommet = p; // Ca t'assure que le sommet pointe sur l'avant dernière cellule (sachant que tu vas supprimer la dernière)
    			}
    		}
     
    //		delete p->suivant; // commenté car inutile, p->suivant étant NULL de par la condition d'arrêt de ta boucle, tu remarqueras que ça ne plante pas car delete NULL n'a aucun effet
     
    		if (p == debut)
    		{// il n'y avait qu'un seul élément dans ta pile
    			debut = NULL;
    		}
     
    		delete p;
    		sommet->suivant = NULL;
    		taille--;
    	}
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. [PHP 5.3] Intercepter une erreur fatale COM
    Par max-mag dans le forum Langage
    Réponses: 4
    Dernier message: 11/03/2014, 14h40
  2. Réponses: 0
    Dernier message: 09/05/2013, 14h53
  3. Prévenir l'admin si une erreur fatale survient
    Par Ceubex dans le forum Général Java
    Réponses: 14
    Dernier message: 07/09/2012, 10h55
  4. Réponses: 0
    Dernier message: 10/06/2011, 10h28
  5. [PHP 5.0] redirection après une erreur fatale
    Par netmaster dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2010, 13h52

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