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

SL & STL C++ Discussion :

pb de vector (encore un)


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut pb de vector (encore un)
    Bonjour,

    Ca fait un certain temps que j'utilise les vector mais là, je suis face à une incompréhension total.

    J'utilise une classe GLignage qui est défini suivant les règles simples des 4 (constructeur,destructeur,recopie, op=). Ca fait 1 semaine que je créé, détruit, copie des objets de cet classe et tout semble rouler pour le mieux.
    Récemment, je décide de rajouter une petite méthode...voici le code (enfin le seul point qui "bug" ...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bool GLignage::soudure(vector<GLignage>& amas)
      {
       if(amas.size()==0)
         {
    	  GLignage glig=*this;
    	  GLignage glig2=glig;
    	  amas.clear();
    	  amas.push_back(glig);
    	  amas.push_back(GLignage(glig.transseg,glig.lignage));
    	  return 1;
         }
     }
    Bon alors c'est un code con, je veux juste faire le push_back(*this) mais j'ai testé plein de détail pour être sûr que ça vient du vector. Après plusieurs heures d'analyse des variables avec mon debuggeur (sous eclipse avec les options classique C++...), j'en suis à ça : le vector passé en référence a tout ses conteneurs (_M_start, _M_finish, _M_end_of_storage) sur 0x00000000 (donc le NULL)... ce qui cause un soucis visiblement...

    qq1 a-t-il déjà rencontré ça? Comment passé à travers?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Il faudrait que tu montres comment tu appelles GLignage::soudure.

    Sinon pour le type bool il existe true et false .

  3. #3
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    et ta fonction ne retourne rien si le test echoue!

    PS à quoi sert : GLignage glig2=glig; ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut
    OK

    Alors, pour le PS... à rien, c'était pour vérifier la recopie dans le debuggeur et s'assurer que *this passait bien
    Je le rappele, je veux juste faire un amas.push_back(*this);

    Pour l'autre demande... elle est également légitime :

    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
     
    //je peux extraire du code cette partie où se situe le pb...
     
    vector<GLignage> recup_tmp;
    vector<GLignage> recup_temp;
     
    //[...] du code sans liaison avec les objets du pb
     
    //une fonction qui remplit recup_temp... au moins 1000 lignes de code en tout
    //alors... mais validé et testé avec succès (50 tests, c'est à dire 2 fois
    //chaque configurations possibles). Avec le debuggeur, on peut observer que
    //l'adresse est inchangée (bonne nouvelle :D) et que les conteneurs sont bien
    //remplis dans un cas de remplissage et inchangé sinon...
     
    if(recup_temp.size()==0)
    	    {
    //code... blablabla
    	    }
    else 
      {
       //ressouder
       for(vector<GLignage>::iterator ite=recup_temp.begin(); ite<recup_temp.end();++ite)
         {
           if(!((*ite).soudure(recup_tmp)))
    	 {// le pb est là!
    	   recup_tmp.push_back(*recup_temp.begin());
    	 }
         }
    }
    Donc je recopie simplement recup_temp dans recup_tmp... avec une gestion de cas lié à ma classe GLignage...simple pourtant!
    ... mais pourquoi des conteneurs sur NULL?! Ca par contre, c'est la première fois! Normalement, faire un vector<truc> vect; ... ça devrait pas.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Donc je recopie simplement recup_temp dans recup_tmp... avec une gestion de cas lié à ma classe GLignage...simple pourtant!
    ... mais pourquoi des conteneurs sur NULL?! Ca par contre, c'est la première fois! Normalement, faire un vector<truc> vect; ... ça devrait pas.
    bonjour, si le debuggeur te signal comme lieu de crash un lieu comme : vecteur<truc>vect; ce qui est normalement sain, ça veut dire que le probléme est ailleurs. ça peut etre un memory corruption provoqué par un autre pointeur, et dont les symptomes n'apparaissent qu'un peu plus loin, dans une ligne portant saine.

    je te propose de revoir le parcours de ton programme et de ne pas te focaliser seulement sur le point qui cause le crash visiblement.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut
    Ouais... j'ai essayé de changer de place... et en fait j'ai pareil.
    C'est donc lié à qq chose d'intrinsèque à mon code.

    Eclipse me dit : Attempt to take contents of a non-pointer value.
    ... j'ai toujours un vecteur initialisé sur des conteneurs vides.

    je passe dans ces fonctions un "vector<GLignage>& vect". Dans une autre fonction ou je fais pareil, ça pose pas de problème. Dans les 2 cas, je fais simplement la définition du vect avant de le transmettre. Si c'était ça, ça devrait le faire dans les 2 cas.

    J'suis vraiment bloqué

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

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. Réponses: 19
    Dernier message: 14/11/2006, 16h45
  3. TEdit (encore)
    Par dj.motte dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/12/2002, 19h02
  4. TPalette (encore)
    Par Flipper dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2002, 23h45

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