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 de pointeur NULL ?


Sujet :

C++

  1. #1
    Membre confirmé Avatar de foolib
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Par défaut Problème de pointeur NULL ?
    Bonjour/bonsoir,

    Mon problème se situe lors de l'exécution (compilation sans erreur ni warnning)
    ... plantage (Classique me direz vous).

    j'ai cherché sur google, mais rien ne m'a aidé (j'ai tenté un "#include <stdlib.h>" en tête de fichier cpp, mais ça n'a rien changé ; j'ai testé de remplacer NULL par 0, et rien à faire )

    DONC
    Dans mon programme, je manipule une collection d'entiers, cette collection est en fait une liste chaînée sous forme de classe :

    attributs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        CSet_int_unit* colstart; // pointeur sur le premier élément
        int nelem; // nombre d'éléments chaînés
    "CSet_int_unit" est une structure dont voici la déclaration :

    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
    // .h
    struct CSet_int_unit
    {
        int valeur;
        CSet_int_unit* next;
     
        void init(int val);
        void setTarget(CSet_int_unit* );
     
    };
    // .cpp
    void CSet_int_unit::init(int val){
        valeur = val;
        next = NULL;
    }
    void CSet_int_unit::setTarget(CSet_int_unit* p){
        next = p;
    }

    j'ai peu à peu commenté puis dé commenté les instructions et je tombe donc sur celle qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            bool CSet_int::add(int n=0){
                CSet_int_unit* tmp = colStart;
                while(tmp->next != NULL){ tmp = tmp->next;} // ça plante là.
                 if(tmp->next == NULL){
                    tmp->next = new CSet_int_unit;
                    tmp->next->init(n);
                    nelem++;
                    return true;
                }
                return false;
            }
    Sensée tester si la structure courante est la dernnière (son attribut pointeur est null) le programme plante quelqu'un aurait une idée ?

    Merci d'avance !

  2. #2
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            bool CSet_int::add(int n=0){
                CSet_int_unit* tmp = colStart;
                while(tmp->next != NULL){ tmp = tmp->next;}
                 if(tmp->next == NULL){
                    tmp->next = new CSet_int_unit;
                    tmp->next->init(n);
                    nelem++;
                    return true;
                }
                return false;
            }
    lors du premier "add" colStart vaut 0 (en effet, la liste est vide)
    mais tu testes "tmp->next", ce qui va planter.
    tu ne peux pas vérifier le "next" du zeroieme element

  3. #3
    Membre confirmé Avatar de foolib
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Par défaut Merci !
    Merci pour ta réponse rapide !
    Très bonne remarque, je n'ai pas fait de pas à pas
    Sans doute la fatigue y était pour quelque chose ... bref encore merci

    Sans transition quelqu'un saurait me dire par quoi est il préférable d'initialiser un pointeur pour qu'il pointe sur rien ?
    0 ou NULL ( définitstdlib.h )

  4. #4
    screetch
    Invité(e)
    Par défaut
    nullptr en c++ 0x, NULL en attendant je pense.

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Pourquoi ne pas utiliser les conteneurs de la STL ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre confirmé Avatar de foolib
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Par défaut @Davidbrcz
    je n'ai rien contre la STL : au contraire ...
    Simplement je me remets dans le bain, d'où ma liste chaînée parmi des exercices pas forcement axés sur le rendement et la simplicité.

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par RipCode Voir le message
    je n'ai rien contre la STL : au contraire ...
    Simplement je me remets dans le bain, d'où ma liste chaînée parmi des exercices pas forcement axés sur le rendement et la simplicité.
    Il est plus efficace de se remettre dans le bain en faisant joujou avec la STL/boost::machin/... qu'en recodant une classe de liste chainée ou what ever.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Par défaut
    Citation Envoyé par RipCode Voir le message
    Sans transition quelqu'un saurait me dire par quoi est il préférable d'initialiser un pointeur pour qu'il pointe sur rien ?
    0 ou NULL ( définitstdlib.h )
    Parce que typiquement, un pointeur qui vaut NULL provoquera toujours un Segmentation Fault si on essaie d'écrire dedans par erreur (faire tmp->next par exemple).

    Si on n'initialise pas un pointeur, il pourra 'par malchance' pointer vers une zone mémoire autorisée, donc ne pas provoquer d'erreur immédiate lors d'une écriture, donc potentiellement corrompre la mémoire.

    Comment alors trouver la source du bogue lorsque, parfois longtemps après, on se retrouve avec des variables erronées ?

    Mettre un pointeur non initialisé à NULL est donc une habitude de programmation pour traquer et éliminer les bogues en amont.

  9. #9
    screetch
    Invité(e)
    Par défaut
    (par quoi, pas pour quoi )

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Par défaut
    oups, ça change tout...

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

Discussions similaires

  1. Problème de pointeur null avec Spring
    Par Psycho185 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 13/09/2013, 20h04
  2. Problème de pointeur null membre de classe
    Par nanotech111 dans le forum Langage
    Réponses: 7
    Dernier message: 17/10/2011, 10h29
  3. problème de pointeurs null
    Par blueLight dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2009, 20h05
  4. Réponses: 0
    Dernier message: 07/10/2008, 10h10
  5. [ODBC] problème de dates - erreur pointeur null
    Par dorot dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 12/07/2006, 12h16

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