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 :

problème d'exceptions, pas d'erreur


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut problème d'exceptions, pas d'erreur
    Bonjour,
    j'ai fait un petit programme pour m'entraîner, et il marche très bien, il affiche ce que je veux, mais le problème, mes exceptions s'affichent quand même.
    Problème d'exception, ou problème de segfault?

    voici mes codes en entier:

    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
    /*
    Auteur : phast
    fichier : Perso.h 
    Date de création : mar. déc. 9 2008
     
    Rôle :
    classe mère générale à tous les persos.
    */
     
     
    #ifndef HEADER_PERSO
    #define HEADER_PERSO
     
    #include <string>
    #include "Except.h" //pour gerer les éxceptions
    #include <iostream>
     using namespace std;
     
    class Perso //classe abstraite = plus d'une fonction virtuel pure
    {
    	public:
    		string getNom() const;
    		int getVie() const; //fonction constante
    		void setNom(const string newNom);
    		void setVie(const int newVie); 
    		virtual void sePresenter() const = 0; //fonction virtuel pure
    		virtual void attaquer(Perso *persoAdv, string nomAdv)const  = 0;
     
     
        protected:
     
    	int *m_vie;
    	string *m_nom;
     
     
        private:
    };
     
    class Guerrier : public Perso
    {
    		public:
    	        Guerrier();
    			Guerrier(const string nom);
    		    ~Guerrier();
    			void sePresenter() const;
    			void attaquer(Perso *adversaire, string nomAdv) const;
     
    	    protected:
     
     
    	    private:
    };
     
     
     
     
    #endif
    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
    /*
    Auteur : phast
    fichier : Perso.cpp
    Date de création : mar. déc. 9 2008
     
    Rôle :
    classe mère générale à tous les persos.
    */
     
     
    #include "Perso.h"
     
    /************************************************
    *                                               *
    * implémentation de la classe abstraite Perso   *
    *                                               *
    *************************************************/
     
    int Perso::getVie() const
    {
    	return *m_vie;
    }
     
    string Perso::getNom() const
    {
    	return *m_nom;
    }
     
    void Perso::setNom(const string newNom)
    {
    	*m_nom = newNom;
    }
     
    void Perso::setVie(const int newVie)
    {
    	*m_vie = newVie;
    }
     
    /**********************************************
    *                                             *
    * implémentation de la classe Guerrier,       *
    * issus de la classe Perso                    *
    *                                             *
    ***********************************************/
     
    Guerrier::Guerrier()
    {
    	m_vie = new int(100);
    	m_nom = new string("l'inconnue");
    }
    Guerrier::Guerrier(const string nom)
    {
    	m_vie = new int(100);
    	m_nom = new string(nom);
    }
     
    void Guerrier::sePresenter() const
    {
    	cout << "Bonjour vilain, comment oses tu me parler? je suis un guerrier, et je m'appelle " << *m_nom << " et j'ai encore "
    																						<< *m_vie << " points de vie" << endl ;
     
    }
     
    void Guerrier::attaquer(Perso *adversaire, string nomAdv) const
    {
    	cout << *m_nom << " attaque avec une superbe hache " << nomAdv << " et lui défonce sa gueule puisque c'est un guerrier " << endl;
    }
    Guerrier::~Guerrier()
    {
    	delete m_vie;
    	delete m_nom;
    }
    et enfin le main:
    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
    /*
    Auteur : phast
    fichier : main.cpp 
    Date de création : mar. déc. 9 2008
     
    Rôle : 
    classe mère générale à tous les persos.
    */
     
    #include "Perso.h"
     
     
    int main(int argc, char* argv[])
     { 
    	 Guerrier *moi, *gol;
    	 try{
    	 moi = new Guerrier("Victor");
    	 throw Erreur(1, "ERREUR lors de initialisation de la variable moi", 2);
    	 }
    	 catch(const exception& e) 
    	 {
    		 cout << "Erreur numéro 1 : " << e.what() << endl;
    	 }
     
    	 try{
    	 gol= new Guerrier("goliath");
    	 throw Erreur(2, "Erreur lors de l'initialisation de la variable goliath", 2);
    	}
    	 catch(const exception &e)
    	 {
    		 cout << "Erreur numéro 2 : " << e.what() << endl;
    	 }
     
    	 try{
    	  moi->sePresenter();
    	  moi->setNom("Phast");
    	  moi->setVie(500);
    	  moi->sePresenter();
     
    	 gol->sePresenter();
    	 gol->setNom("mechant");
    	 gol->setVie(50);
    	 gol->sePresenter();
    	 moi->attaquer(gol,string("mechant"));
    	throw Erreur(3, "ERREUR lors de l'appels des différentes fonctions");
    	 }
    	 catch(const exception &e)
    	 {
    		 cout << "Erreur numéro 3 : " << e.what() << endl;
    	 }
     
     
    	 delete moi;
    	 delete gol;
    return 0;
     
    }
    (je vous passe le fichier Except, c'est une classe issus de la classe exceptions)


    et voici ce que me dit la console:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Erreur numéro 1 : ERREUR lors de initialisation de la variable moi
    Erreur numéro 2 : Erreur lors de l'initialisation de la variable goliath
    Bonjour vilain, comment oses tu me parler? je suis un guerrier, et je m'appelle Victor et j'ai encore 100 points de vie
    Bonjour vilain, comment oses tu me parler? je suis un guerrier, et je m'appelle Phast et j'ai encore 500 points de vie
    Bonjour vilain, comment oses tu me parler? je suis un guerrier, et je m'appelle goliath et j'ai encore 100 points de vie
    Bonjour vilain, comment oses tu me parler? je suis un guerrier, et je m'appelle mechant et j'ai encore 50 points de vie
    Phast attaque avec une superbe hache mechant et lui défonce sa gueule puisque c'est un guerrier 
    Erreur numéro 3 : ERREUR lors de l'appels des différentes fonctions
    voilà, quelqu'un voit un prolbème?

    merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Points : 379
    Points
    379
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try{
    	 moi = new Guerrier("Victor");
    	 throw Erreur(1, "ERREUR lors de initialisation de la variable moi", 2);
    	 }
    Là tu throw l'erreur à tous les coups, puisque c'est ce que fais le mot clef throw. Je ne comprends pas ce que tu veux faire? Que le constructeur te lances une exception? Dans ce cas, le throw doit être dans le constructeur.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tes exceptions il faut les lever dans le constructeur de Guerrier.
    À part ça je vois pas pourquoi tu fais des new, pourquoi ne pas utiliser des Guerrier directement ?
    Boost ftw

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Et pourquoi tous ces new dans le constructeur de Guerrier lui-même? Pourquoi m_vie et m_nom sont-ils des pointeurs?
    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.

  5. #5
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Et pourquoi tous ces new dans le constructeur de Guerrier lui-même? Pourquoi m_vie et m_nom sont-ils des pointeurs?
    ça sent le java :p

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Même en java, un programmeur qui me met des Integer i = new Integer(42) à la place de simple int i=42, je le frappe, moi...
    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.

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    @Cheps : ok merci, j'ai compris le problème, je vais changer ça tout de suite

    @les autres : Une mauvaise habitude que j'ai prise, mais je ne sais pas d'où.
    Quand faut il mettre des pointeurs dans une classe et quand faut il mettre des variables normales?


    merci de vos réponses

  8. #8
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Si tu peux ne pas utiliser de pointeurs, préfère la solution simple

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Traduction: Utiliser des pointeurs quand on ne peut pas faire autrement.
    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.

  10. #10
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Traduction: Utiliser des pointeurs quand on ne peut pas faire autrement.
    Tout a fait d'accord
    If you type Google into Google, you Can break the internet" - The IT Crowd

  11. #11
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    J'avoue que dans ce sens ça sonne mieux

  12. #12
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    OK merci tout le monde,
    je modifie mon code pour tester.

    encore merci

  13. #13
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Alors j'ai modifier le code, mais il y a encore un problème, l'exception se manifeste après avoir changer de nom et de vie;
    voici les codes:

    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
    /*
    Auteur : phast
    fichier : main.cpp 
    Date de création : mar. déc. 9 2008
     
    Rôle : 
    classe mère générale à tous les persos.
    */
     
    #include "Perso.h"
     
     
    int main(int argc, char* argv[])
     { 
    	 Guerrier *moi, *gol;
    	 try{
    	 moi = new Guerrier("Victor");
    	 }
         catch (exception &e)
    	{
    		 cout << e.what() << endl;
     
    	 }     
    	 try{
    	 gol= new Guerrier("goliath");
    	}
    	 catch (exception &e)
    	 {
    		 cout << e.what() << endl;
    	 }
     
    	 try{
    	  moi->sePresenter();
    	  moi->setNom("Phast");
    	  moi->setVie(500);
    	  moi->sePresenter();
     
    	 gol->sePresenter();
    	 gol->setNom("mechant");
    	 gol->setVie(50);
    	 gol->sePresenter();
    	 moi->attaquer(gol,string("mechant"));
    	 }
    	catch(exception &e)
    	{
    		cout << e.what() << endl;
    	}	 
    	 delete moi;
    	 delete gol;
    return 0;
     
    }
    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
    /*
    Auteur : phast
    fichier : Perso.h 
    Date de création : mar. déc. 9 2008
     
    Rôle :
    classe mère générale à tous les persos.
    */
     
     
    #ifndef HEADER_PERSO
    #define HEADER_PERSO
     
    #include <string>
    #include "Except.h" //pour gerer les éxceptions
    #include <iostream>
     using namespace std;
     
    class Perso //classe abstraite = plus d'une fonction virtuel pure
    {
    	public:
    		string getNom() const;
    		int getVie() const; //fonction constante
    		void setNom(const string newNom);
    		void setVie(const int newVie); 
    		virtual void sePresenter() const = 0; //fonction virtuel pure
    		virtual void attaquer(Perso *persoAdv, string nomAdv)const  = 0;
     
     
        protected:
     
    	int m_vie;
    	string m_nom;
     
     
        private:
    };
     
    class Guerrier : public Perso
    {
    		public:
    	        Guerrier();
    			Guerrier(const string nom);
    		    ~Guerrier();
    			void sePresenter() const;
    			void attaquer(Perso *adversaire, string nomAdv) const;
     
    	    protected:
     
     
    	    private:
    };
     
     
     
     
    #endif
    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
    /*
    Auteur : phast
    fichier : Perso.cpp
    Date de création : mar. déc. 9 2008
     
    Rôle :
    classe mère générale à tous les persos.
    */
     
     
    #include "Perso.h"
     
    /************************************************
    *                                               *
    * implémentation de la classe abstraite Perso   *
    *                                               *
    *************************************************/
     
    int Perso::getVie() const
    {
    	return m_vie;
    }
     
    string Perso::getNom() const
    {
    	return m_nom;
    }
     
    void Perso::setNom(const string newNom)
    {
    	m_nom = newNom;
    }
     
    void Perso::setVie(const int newVie)
    {
    	m_vie = newVie;
    }
     
    /**********************************************
    *                                             *
    * implémentation de la classe Guerrier,       *
    * issus de la classe Perso                    *
    *                                             *
    ***********************************************/
     
    Guerrier::Guerrier()
    {
    	m_vie = 100;
    	m_nom = "l'inconnue";
    	throw Erreur(1, "ERREUR dans le constructeur par défaut");
    }
     
    Guerrier::Guerrier(const string nom)
    {
    	m_vie = 100;
    	m_nom =  nom;
    }
     
    void Guerrier::sePresenter() const
    {
    	cout << "Bonjour vilain, comment oses tu me parler? je suis un guerrier, et je m'appelle " << m_nom << " et j'ai encore "
    																						<< m_vie << " points de vie" << endl ;
    	throw Erreur(2, "ERREUR dans la fonction se Presenter() ");
    }
     
    void Guerrier::attaquer(Perso *adversaire, string nomAdv) const
    {
    	cout << m_nom << " attaque avec une superbe hache " << nomAdv << " et lui défonce sa gueule puisque c'est un guerrier " << endl;
    	throw Erreur(3, "Erreur dans la fonction attaquer ");
    }
    Guerrier::~Guerrier()
    {
    	}
    et voici le résultat console:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [phast@ordi-phast:~/Bureau/programmation/C++/perso]$ ./a.out 
    Bonjour vilain, comment oses tu me parler? je suis un guerrier, et je m'appelle Victor et j'ai encore 100 points de vie
    ERREUR dans la fonction se Presenter()
    Voilà, donc si vous savez où se trouve l'erreur, si vous avez des conseils de programmation, merci d'avance

  14. #14
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Premièrement: Pourquoi moi et gol sont des pointeurs?

    Tu peux les déclarer en dur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Guerrier moi("Victor");
    Guerrier gol("goliath");

    Deuxièmement: Pourquoi tu fais systématiquement un throw à la fin de tes fonctions membres?

    Tu dois faire un throw seulement si tu veux lancer explicitement une erreur.
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (val == 0)
      throw Erreur(1, "Division par zéro imposible");
     
    return val / nb;

  15. #15
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Vu que je les déclare dans un try, sans être un pointeur, ils seraient supprimé à la fin des accolades du try, non?

    Là c'était surtout pour trouver l'erreur de segfault, mais autrement je les utilise surtout pour éviter des erreurs que l'utilisateur pourrait faire.

    Parce qu'il y a t'il un autre moyen de trouver des segfault?
    Et comment utiliser un constructeur autre que celui par défaut par une variable normale?

    EDIT: j'ai enlever les exceptions et ça marche...

  16. #16
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Le try permet d'intercepter les exceptions. Vu que tu lances des exceptions systématiquement à la fin de toutes tes fonctions membres (sauf Guerrier(const string nom)), alors une exception sera toujours catchée. D'où le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERREUR dans la fonction se Presenter()
    Fais un throw seulement si une une condition que tu veux tester n'est pas valide comme l'exemple que je t'ai donné plus haut ...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ce qui peut causer des segfault, c'est utiliser des pointeurs non-initialisés ou nuls.
    Notamment, si une exception est lancée dans la construction de moi ou de gol, les pointeurs resteront non-initialisés (et ils ne seront même pas nuls).
    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.

  18. #18
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Tu pourrais simplifier le main ainsi :

    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
    int main(int argc, char* argv[])
     { 
    	 try{
    	 Guerrier moi("Victor"), gol("goliath");
     
    	 moi.sePresenter();
    	 moi.setNom("Phast");
    	 moi.setVie(500);
    	 moi.sePresenter();
     
    	 gol.sePresenter();
    	 gol.setNom("mechant");
    	 gol.setVie(50);
    	 gol.sePresenter();
    	 moi.attaquer(&gol,"mechant");
    	 }
    	catch(exception &e)
    	{
    		cout << e.what() << endl;
    	}
    return 0;
     
    }

  19. #19
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Vous avez du mal comprendre ma question (mais merci quand même pour vos réponse )

    Quels sont les moyens pour situer les segfault, au lieu de parcourir tout le code
    (avec Qt, il y a qDebug )?

    mais merci quand même pour vos réponses

  20. #20
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ce genre de chose se débogue bien avec valgrind.
    Boost ftw

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/04/2014, 20h35
  2. "nullPointer exception", je trouve pas l'erreur
    Par SuperArbre dans le forum Persistance des données
    Réponses: 6
    Dernier message: 09/10/2012, 15h00
  3. "Exception was unhandled" Erreur pas bien claire
    Par Just-Soft dans le forum C#
    Réponses: 2
    Dernier message: 17/03/2009, 15h32
  4. Réponses: 7
    Dernier message: 14/11/2008, 12h49
  5. Réponses: 10
    Dernier message: 18/07/2007, 20h15

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