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 :

Hash_set GNU Windows


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Par défaut Hash_set GNU Windows
    Bonjour,

    J'ai récupéré un code que je souhaite faire tourner sur ma machine.

    Ce code a été réalisé sous Linux, compilé via le compilateur GNU et utilise le Hash_set de la GNU STL.

    Pour ma part, je développe en Visual Studio C++ (compliateur Vc7). J'ai vu qu'il existait une classe Hash_set définie pour le compilateur Vc7. J'ai essayé de l'utiliser mais cela ne fonctionne pas. Etant débutant en C++, j'avoue ne pas comprendre extrêment bien le rôle de ce hash_set et donc, ne pas comprendre no plus comment débugger pour faire tourner mon code sous Windows.

    Voici le code original (qui compile sous Linux avec le compilateur GNU):
    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
    33
     
    #include <ext/hash_set>
    #include <ext/hash_map>
     
    using namespace __gnu_cxx;
     
    template<class _T>
    class hash_compare_for_pairs {
    private:
       typedef pair<vector<_T>,_T> Key;
    public:
       static const size_t bucket_size = 4;
       static const size_t min_buckets = 20000;
       size_t operator()(const Key & k) const {
          size_t h = 0;
          for( int i = 0; i<k.first.size(); i++ ) 
             h = ((h<<1) | ((h>>31) & 1)) ^ (long)k.first[i];
          return h;
       };
    };
     
    template<class _T>
    class equalkey_for_pairs {
    private:
       typedef pair<vector<_T>,_T> Key;
    public:
       bool operator()(const Key & k1, const Key & k2) const
       {
          return (k1.first == k2.first) && (fabs(k1.second-k2.second) <= alphadist);
       };
    };
     
    hash_set<pair<vector<double>,double>, hash_compare_for_pairs<double>, equalkey_for_pairs<double> > history;
    Dans mon propre code (sous Visual Studio C++), j'ai simplement changé les include et le namespace utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <hash_set>
    #include <hash_map>
     
    using namespace stdext;
    et ca ne marche pas... Voici une partie des erreurs indiquée :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\hash_set(22) : error C2903: 'rebind' : le symbole n'est ni un modèle de classe ni un modèle de fonction
            D:\Microsoft Visual Studio .NET 2003\Vc7\include\xhash(156) : voir la référence à l'instanciation du modèle de classe 'stdext::_Hset_traits<_Kty,_Tr,_Alloc,_Mfl>' en cours de compilation
            with
            [
                _Kty=std::pair<std::vector<double>,double>,
                _Tr=hash_compare_for_pairs<double>,
                _Alloc=equalkey_for_pairs<double>,
                _Mfl=false
            ]
            D:\Microsoft Visual Studio .NET 2003\Vc7\include\hash_set(55) : voir la référence à l'instanciation du modèle de classe 'stdext::_Hash<_Traits>' en cours de compilation
            with
            [
                _Traits=stdext::_Hset_traits<std::pair<std::vector<double>,double>,hash_compare_for_pairs<double>,equalkey_for_pairs<double>,false>
            ]
            fp.cpp(89) : voir la référence à l'instanciation du modèle de classe 'stdext::hash_set<_Kty,_Tr,_Alloc>' en cours de compilation
            with
            [
                _Kty=std::pair<std::vector<double>,double>,
                _Tr=hash_compare_for_pairs<double>,
                _Alloc=equalkey_for_pairs<double>
            ]
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\hash_set(22) : error C2039: 'rebind' : n'est pas membre de 'equalkey_for_pairs<_T>'
            with
            [
                _T=double
            ]
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\hash_set(22) : error C2143: erreur de syntaxe : absence de ';' avant '<'
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\hash_set(22) : error C2039: 'other' : n'est pas membre de 'operator``global namespace'''
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\hash_set(23) : error C2238: jetons inattendus avant ';'
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\xhash(168) : error C2039: 'allocator_type' : n'est pas membre de 'stdext::_Hset_traits<_Kty,_Tr,_Alloc,_Mfl>'
            with
            [
                _Kty=std::pair<std::vector<double>,double>,
                _Tr=hash_compare_for_pairs<double>,
                _Alloc=equalkey_for_pairs<double>,
                _Mfl=false
            ]
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\xhash(168) : error C2146: erreur de syntaxe : absence de ',' avant l'identificateur 'allocator_type'
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\xhash(168) : error C2065: 'allocator_type' : identificateur non déclaré
    D:\Microsoft Visual Studio .NET 2003\Vc7\include\xhash(168) : error C2976: 'std::list' : nombre d'arguments de modèle insuffisant
    ...
    Qq'un peut-il m'aider svp à paramétrer tout ça ?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Cela ressemble à un problème d'installation ou de configuration de Visual Studio. Essaye de compiler ce code très simple pour voir si ça viens bien de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <hash_set>
     
    int main() {
      stdext::hash_set<int> hs;
    }

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Non oubli, en fait c'est une petite différence d'utilisation entre les hash_set de GNU et les hash_set de Visual. L'équivalent sous Visual doit être le code suivant :
    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
    template<class _T>
    class hash_compare_for_pairs {
    private:
       typedef pair<vector<_T>,_T> Key;
    public:
       static const size_t bucket_size = 4;
       static const size_t min_buckets = 20000;
       size_t operator()(const Key & k) const {
          size_t h = 0;
          for( int i = 0; i<k.first.size(); i++ ) 
             h = ((h<<1) | ((h>>31) & 1)) ^ (long)k.first[i];
          return h;
       };
       bool operator()(const Key & k1, const Key & k2) const
       {
          return (k1.first == k2.first) && (fabs(k1.second-k2.second) <= alphadist);
       };
    };
     
    hash_set<pair<vector<double>,double>, hash_compare_for_pairs<double> > history;

  4. #4
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Par défaut
    Je viens de réaliser ton test. Cela compile parfaitement.

    La ligne qui empêche la compilation de mon code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hash_set<pair<vector<double>,double>, hash_compare_for_pairs<double>, equalkey_for_pairs<double> > history;
    Si je déclare ton main simple avec cette variable de classe history définie, cela ne compile pas. Sans, ça compile nickel.

    N'y-t-il pas de différence notable entre le Hash_Set du compilateur GNU et celui de Vc7 ? En gros, mon code n'utilise-t-il pas qq chose définie sous le compilateur GNU pas sous Vc7 ?

  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Par défaut
    Merci beaucoup à toi Sylvain Togni !!!

    Cela corrige en effet mon problème. Désormais cela compile (même s'il reste un avertissement à la compilation lors de l'utilisation d'history).

    Je vais tâcher de voir cela cet après-midi et si je parviens à régler le pb. Je taggerai ce post comme Résolu.

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

Discussions similaires

  1. convertir de l'asm gnu en windows 16 ou 32 bits
    Par Linquisiteur dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 10/05/2013, 18h11
  2. Le jeu Left 4 Dead 2 plus rapide sous GNU/Linux que sous Windows
    Par Hinault Romaric dans le forum Développement 2D, 3D et Jeux
    Réponses: 63
    Dernier message: 28/09/2012, 23h13
  3. Capture écran en C (Sous Windows et GNU/Linux)
    Par Bentiti dans le forum Débuter
    Réponses: 1
    Dernier message: 17/03/2012, 16h34
  4. Réponses: 1
    Dernier message: 18/02/2009, 16h45
  5. Mysql sur Windows 2003 Server ou GNU/Linux
    Par dorian-ya67 dans le forum Installation
    Réponses: 2
    Dernier message: 18/08/2008, 10h52

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