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 :

comment tester l'existance d'un pointeur ?


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut comment tester l'existance d'un pointeur ?
    Bonjour,

    J'aimerai pouvoir faire ceci (le if) :

    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
    class Truc
    {
    	private:
    		Objet<int> * vec;
     
    	public:
    		truc(){} //Constructeur
     
    		void display()
    		{
    			if(vec)
    				vec->display();
    		}
     
    		[...]
    };
    J'ai trouvé une solution à ce probleme mais n'y a t il pas quelque chose de plus propre ? :

    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
    class Truc
    {
    	private:
    		Objet<int> * vec;
     
    	public:
    		truc()
    		{
    			vec = 0;
    		} //Constructeur
     
    		void display()
    		{
    			if(vec != 0)
    				vec->display();
    		}
     
    		[...]
    };
    merci d'avance.

  2. #2
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonjour.
    Ne cherche pas, c'est la solution préconisée.

    Si un pointeur ne pointe sur rien de particulier, on lui donne une valeur invalide, afin qu'il ne puisse pas être déréférencé.
    Par convention, on utilise une valeur particulière : NULL (*) (ou nullptr en C++11).

    Et alors, lorsque l'on veut tester si un pointeur pointe sur une zone mémoire valide, on peut utiliser un simple test : (ptr != NULL) (ou (ptr == NULL) selon le cas).
    De plus, en C/C++ il y a une conversion implicite pointeur -> booléen, exactement comme pour les entiers : un pointeur égal à NULL/nullptr est équivalent à false, tous les autres sont équivalents à true.


    Donc pour ton problème, ton premier code suffit (presque) :
    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
    class Truc
    {
    	private:
    		Objet<int> * vec;
     
    	public:
    		truc() : vec()  // C'est conseillé d'utiliser les listes d'initialisation
                    {} //Constructeur
     
    		void display()
    		{
    			if(vec)
    				vec->display();
    		}
     
    		[...]
    };
    Tu peux éventuellement passer NULL au constructeur de vec pour être sûr qu'il aura la bonne valeur.


    (*) De mémoire, c'est une macro définie ainsi :

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    (*) De mémoire, c'est une macro définie ainsi :
    La définition de NULL est "implementation defined", mais ca ne peut pas être (void*) 0, par contre ca peut-être 0 ou 0L. (draft n3242)

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Ok merci beaucoup pour vos réponses

  5. #5
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    La définition de NULL est "implementation defined", mais ca ne peut pas être (void*) 0, par contre ca peut-être 0 ou 0L. (draft n3242)
    Ok.
    J'ai sûrement dû extrapoler pour le cast...

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Euh juste pour info, est ce que on peut catcher un Stack Overflow car je n'y arrive pas ?

    (le message d'erreur : Exception non gérée : stack overflow --> donc je suppose que c'est une exception non ?)

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    En fait j'ai des algos sur images et je voudrai qu'il remonte la pile d'appel (qu'il arrête la récursivité) quand ya un stackoverflow !?

  8. #8
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Tu as essayé de la capturer à l'aide de std::exception ?
    Parce que si ce n'est pas possible, ce n'est pas la peine de te prendre la tête.

    Si tu veux être plus précis, va farfouiller dans le fichier d'en-tête « stdexcept », il contient les principales exceptions standards.
    Je parierais pour std::runtime_error ou l'une de ses sous-classes.
    En tout cas, je ne connais pas d'exception spéciale pour le stack overflow.

    Pour plus d'informations, tu peux trouver le diagramme de la hiérarchie des exceptions (dans g++ 4.6) à cette adresse.

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Ouep merci pour le lien, yen a 2 qui m’intéresserai :
    out_of_range et overflow

    Je n'arrive pas à catcher la super class exception, je ne comprend pas... Pourtant ça devrai marcher nan ?

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Là j'ai un out_of_range que je ne peut pas expliquer... et j'arrive pas à catcher 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    try
    			{
    				compteur = 0;
    				bool pixelRecurs = false;
    				for(int u = 1 ; u < height - 1 ; u++)
    				{
    					for(int i = 1 ; i < width - 1; i++)
    					{
    						if((*passagesInt)[i][u] == 1)
    						{
    							if((*passagesInt)[i + 1][u] == 0 || (*passagesInt)[i][u + 1] == 0 || (*passagesInt)[i][u - 1] == 0 || (*passagesInt)[i - 1][u] == 0)
    							{
    								i = width;
    								u = height;
    								x = i;
    								y = u;
    								pixelRecurs = true;
    							}
    							else
    							{
    								(*passagesInt)[i][u] = 2;
    							}
    						}
    					}
    				}
    				if(!pixelRecurs)
    					return false;
    			}
    			catch(const exception &e)
    			{
    				cout << e.what() << endl;
    			}
    C'est peut etre pas une exception ?! mais du coup c'est quoi std::out_of_range qui hérite de exception ?

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 59
    Points : 22
    Points
    22
    Par défaut
    Oubiez ce problème de out_of_range (en fait c'est quand je change de i et u, il reboucle quand même... c'est bizarre)

    Je recréer donc un post en demandant comment je peux catcher une stack overflow sur un exemple simple :

    http://www.developpez.net/forums/d11...w/#post6331485

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Ok.
    J'ai sûrement dû extrapoler pour le cast...
    Pas tant que ça : c'est l'une des définitions authorisée de NULL dans le standard C99.

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

Discussions similaires

  1. [PL/SQL] Comment tester l'existence d'un champ?
    Par nanou9999 dans le forum Oracle
    Réponses: 4
    Dernier message: 19/04/2012, 15h25
  2. Réponses: 3
    Dernier message: 23/01/2006, 15h40
  3. comment tester l'existence d'un propriété?
    Par korntex5 dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2006, 14h23
  4. Socket : comment tester l'existence d'un serveur?
    Par bios dans le forum Réseau
    Réponses: 4
    Dernier message: 26/12/2005, 16h51
  5. [IdTCP] Comment tester l'existence de messages en attente ?
    Par HopeLeaves dans le forum Web & réseau
    Réponses: 1
    Dernier message: 29/06/2005, 10h03

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