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

wxWidgets Discussion :

wxHashMap créer KeyHasher et Keyequal


Sujet :

wxWidgets

  1. #1
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut wxHashMap créer KeyHasher et Keyequal
    Voila j'ai créer une petite hashmap pour stocker des matériaux et des groupes de meshes .
    La clef est le matériaux et l'objet le MesheGroupe
    Chaque meshe est associé à un matériaux. Si celui-ci existe déja dans cette hashmap, j'ajoute la meshe au MesheGroupe. Problème il ne trouve jamais de matériaux. . Enfin si une fois mais il devrait l'avoir fait pleins de fois avant.


    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
     
    // hashing function
    class MateriauxHash
    {
    public:
        MateriauxHash() { }
     
    #if wxUSE_STL && defined(HAVE_STL_HASH_MAP)
        size_t operator()( const Materiaux* k ) const { return (size_t)k; }
    #else
        wxUIntPtr operator()( const Materiaux* k ) const { return wxPtrToUInt(k); }
    #endif
     
        MateriauxHash& operator=(const MateriauxHash&) { return *this; }
    };
     
    //comparison operator
    class MatKeyEqual
    {
        public:
            MatKeyEqual() { }
            bool operator()( const Materiaux* a, const Materiaux* b ) const { return a->Compare(b); }
     
            MatKeyEqual& operator=(const MatKeyEqual&) { return *this; }
    };
     
     
    WX_DECLARE_HASH_MAP( Materiaux*, MesheGroupe*, MateriauxHash, MatKeyEqual, HashMapLoadMatMeshe );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                                    HashMapLoadMatMeshe::value_type avalue( aMateriaux,new MesheGroupe() );
     
                                    HashMapLoadMatMeshe::Insert_Result aresultinsert = aHMLoadMatMeshe.insert(avalue);
                                    if(!aresultinsert.second)
                                    {//le matériaux existe déja
                                        delete aMateriaux;
                                        delete avalue.second;
                                    }
                                    aresultinsert.first->second->AddMeshe( aMeshe );
    Ce code lance un test d'égalité lors d'une N ème insertion mais au deuxième il aurait déja dû le faire. Je comprend pas, pour chaque clef rajoutée, il devrait faire un test sur chaqu'une des clefs ? Là après en avoir inséré plusieurs il me fait un test et se révèle positif. Je comprend pas comment marche cette HashMap

    J'ai essayé avec des find et l'opérateur []
    Mais ayant des pointeurs à lui passé, j'ai pas envie de lui laisser créer par défaut les MeshesGroupes.

    Voici quelques liens:
    http://www.wxwidgets.org/manuals/sta...wxhashmap.html
    http://www.wxwidgets.org/wiki/index....Text_Templates
    http://www.sgi.com/tech/stl/hash_map.html

    EDIT: zut j'aurais du mettre le sujet dans wxwidget c++ (désolé me suis trompé)
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  2. #2
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Pinaise j'y arrive toujours pas.
    Raaa misère je lacherais pas le morceau.

    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
    bool trouve = false;
     
    for( HashMapLoadMatMeshe::iterator itHMLoadMatMeshe = aHMLoadMatMeshe.begin() ; itHMLoadMatMeshe != aHMLoadMatMeshe.end(); ++itHMLoadMatMeshe )
    {
        if( itHMLoadMatMeshe->first->Compare(aMateriaux) )
            trouve = true;
    }
    if(!trouve)
    {
        MesheGroupe * aMesheGroup = new MesheGroupe();
        aMesheGroup->AddMeshe( aMeshe );
        aHMLoadMatMeshe[aMateriaux] = aMesheGroup;
    }
    else
    {
        aHMLoadMatMeshe[aMateriaux]->AddMeshe( aMeshe );
    }
    alors que mon for trouve un matériaux , l'ajout se fait sur un MesheGroupe vide
    cela vien du fait que [] créé une cellule (avec aMateriaux comme clef et un objet par defaut) quand il ne trouve pas la clef.

    EDIT:
    Je viens d'essayé
    aHMLoadMatMeshe[itHMLoadMatMeshe->first]->AddMeshe( aMeshe );
    à la place de aHMLoadMatMeshe[aMateriaux]->AddMeshe( aMeshe );
    Pour voir si en mettant la même adresse checker plus haut dans le for passerait. Je vais essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WX_DECLARE_HASH_MAP( Materiaux*, MesheGroupe*, wxPointerHash, wxPointerEqual, HashMapLoadMatMeshe );
    comme grace au first normalement la comparaison d'adresse devrait fonctionné et avec la recherche de la clef dans le for auparavant ça devrait fonctionné, sinon soit les hashmap sont moisi, soit y a un truc qui m'échappe.

    EDIT: Ca me fait pareil avec wxPointerHash, wxPointerEqual...donc les hashmap sont pourries....non ça vient de moi....:p
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  3. #3
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    J'ai créer un projet minimale (sur ubuntu )
    j'obtien pas d'erreur d'allocation pour une itération de 50, pour une à 500 c'est fini :p. Avec deux clefs (des matériaux) différentes, pour 50 itérations j'obtiens 39 éléments dans ma hashmap. Alors qu'il devrait en avoir que deux .
    Fichiers attachés Fichiers attachés
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  4. #4
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Je viens de tester ça :
    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
        //testons si elle retrouve ses propres clefs
        for(HashMapLoadMatMeshe::iterator it = frame->m_hash.begin(); it!= frame->m_hash.end(); ++it)
        {
            HashMapLoadMatMeshe::iterator it2 = frame->m_hash.find(it->first);
            if(it2 != frame->m_hash.end())
            {
                Log = it2->second->m_Nom;
                wxLogError(Log);
            }
            else
            {
                Log = wxT("No FIND !!!");
                wxLogError(Log);
            }
     
        }
    Dans cette boucle de cinq itérations (puiqu'elle a inséret les 5 élements et comme toujours elle ne les a pas regroupé par nom):
    La HasheMap effectue bien tout les tests d'égalités et les réussi tous, (bizard elle ne fait que 5 tests, comme si elle avait stocker leur position avec le pointeur...bein faut croire que oui puisque le hasher est comme celui des pointeurs...et des types de bases comme les int (suffit de regarder le header).
    Mais quand j'inser, elle ne fait aucun test d'égalité. je me demande à quoi il servent d'ailleur, puisque que à chaque fois qu'ellen'en fait un , c'est égale :o.
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  5. #5
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Bon je vais clarifié mon problème

    J'ai défini une hashemap
    la clef est un pointeur sur un matériaux
    l'objet un pointeur sur un meshegroup
    le hasheur renvoi la taille du pointeur
    le test d'égalité renvoi le résultat de a->Compare(b)

    problème :
    - j'insert ma première paire, une clef un matériaux ,
    - la deuxième je l'insert avec un même matériaux (mais adresse différente) et un autre meshegroupe.
    -> résultat: la plus pare des clefs ne subissent pas le test dégalité.
    -> donc le parcour en interne déconne
    -> donc je suppose que se parcour est fait grâce au hasheur
    -> j'ai essayé avec la taille d'une string (le nom de la composante diffuse au pif)
    -> ça marche aussi mal.

    Merci d'avance :p
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

Discussions similaires

  1. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22
  2. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10
  3. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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