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 :

Probleme pour concatener 2 objets Set


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 24
    Points
    24
    Par défaut Probleme pour concatener 2 objets Set
    bonjour,

    j'ai un petit probleme pour effectuer une concatenation de 2 objets set de la STL.

    En fait je copie un 1er objet set dans un nouvel objet set, puis je souhaite inserer les valeurs d'un 2eme objet a la suite de mon nouvel objet set :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    objetSet objSet;
    	objSet= objSet1;
    	objSet.insert(objSet2.begin(),objSet2.end());
    j'ai essayé ca, mais ca fonctionne de maniere aléatoire, l'insert plante régulièrement, je ne sais pas pourquoi, peut-être existe-t-il une methode plus adequate pour faire ca.

    si quelqu'un a une idée ?

    Merci

  2. #2
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    t'as essayé ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::copy(set1.begin(), set1.end(), std::back_inserter(set2.end()));
    pour copier set1 a la fin de set2...
    besoin de réponses ? demande a un pote

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    std::back_inserter va faire des push_back, ça ne marchera pas sur un set. Il faut un std::inserter je crois.

    Mais bon le code original semble correct. S'il est mis à part dans un code minimal il plante toujours ?

    Et... tu insères combien d'objets en tout ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    En fait, effectivement, le code original isolé fonctionne.

    Le probleme étant que dans mon appli, je passe par une methode dans laquelle :
    1°) j'effectue le traitement précédent.

    2°) je passe dans une methode qui modifie les objet de mon objSet2

    3°) on repasse dans la methode du 1°) avec l'objSet2 modifié, et donc c'est là que ca plante, j'ai l'impression qu'il y a un probleme sur la perte des id des objets contenus dans objSet2

    en general objSet1 contient 1500 objet et objSet2 en contient 30.

    Je test les différentes proposition

    merci

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    j'ai essayé la proposition de toxcct, et ca donne le meme comportement.

    ca fonctionne le premier coup et pas le deuxieme, meme exception sur la perte de l'id de l'objet.

    c'est donc de mon traitement suivant que doit venir le probleme

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est quoi les objets de ton set ? Comment est défini l'opérateur < dessus ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Très bonne question de JolyLoic,

    en fait les objet de mon set sont des pointeurs qui ont pour attribut un oid,
    et mon set triait ces objets par l'id.

    Dans le 3eme passage dans la methode comme j'expliquais plus haut,
    l'oid des objets a été supprimé par une methode intermédiaire,
    donc, pendant l'insertion d'un objet dans mon set, il cherche a ordonné le set en fonction de l'id, et donc ca plantait puisqu'il n'y était plus.

    Solution trouvée : Création d'une structure triée par le pointeur et non par l'Id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    struct ObjetTrieeParPointeur
    	{
    		bool operator()(
    			Objet* obj1,
    			Objet* obj2) const
    		{
    			return (obj1 < obj2);
    		}
    	};
     
    typedef set<Objet*, ObjetTrieeParPointeur>
    		SetObjetTrieeParPointeur;
    Voilà

    Merci à tous

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'opérateur < est défini sur les pointeurs, pas besoin de créer un foncteur de comparaison perso pour ça

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Ok merci !

    Par contre maintenant, j'ai une nouvelle exception toujours dans le 3eme passage par la methode, mais après être passé par l'insert,

    lorsque je passe par un iterateur, il me retourne une exception sur le malloc (dbgheap.c) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    objetSet::const_iterator iter;
     
    objetSet objSet;
    	objSet= objSet1;
    	objSet.insert(objSet2.begin(),objSet2.end());
     
    for (iter = objSet.begin(); iter != objSet.end(); iter++)
    {
         MaClasse* objetdeMaclass = dynamic_cast<MaClasse*>(*iter);
     
    }
    MaClasse heritant de la classe des objets contenus dans objetSet

    j'ai l'impression que c'est le dynamic_cast qui plante, mais avant d'utiliser des set, j'utilisais des liste de la stl et ca ne plantait pas...

  10. #10
    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 519
    Points
    41 519
    Par défaut
    Une exception C++, une exception Win32, une assertion qui foire ou une Debug Error ?
    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.

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Et un merge ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Il s'agit d'une exception :

    Microsoft C++ exception: __non_rtti_object

    Run Time Type Information qui serait liée d'après mes recherches au dynamic_cast.

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le RTTI est-il activé ? Ta classe de base possède-t-elle au moins une fonction virtuelle ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Le RTTI est bien activé et ma classe possède bien une methode virtuelle.

    j'ai refait mes tests en enlevant l'insert et ca ne plante plus.

    En fait, ce sont les objets que j'insere qui sont détruits par ma methode intermédiaire (traitement qui est nécessaire et qui,
    à la 3eme étape font planter le dynamic_cast.

    Ce qui est intriguant c'est que la base de mon changement était de remplacer mes listes par des set, et que avec les listes je n'avait pas de plantage, même avec les objets détruits ...

Discussions similaires

  1. Probleme pour afficher un objet dans la vue ?
    Par Zoners dans le forum ASP.NET MVC
    Réponses: 4
    Dernier message: 14/03/2012, 10h47
  2. probleme pour générer des objets aleatoirement
    Par tonytrua dans le forum Débuter
    Réponses: 10
    Dernier message: 09/12/2011, 15h09
  3. Réponses: 2
    Dernier message: 23/04/2010, 01h16
  4. Réponses: 2
    Dernier message: 03/06/2009, 11h35
  5. Réponses: 3
    Dernier message: 31/03/2008, 15h13

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