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 :

Tableau associatif map.


Sujet :

C++

  1. #1
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut Tableau associatif map.
    Le bout de code suivant:

    typedef map < Str, Str, less < Str > > Table;

    me donne l'erreur de compilation suivante:

    parse error before `<'

    Je ne sais pas du tout ce que celà siginfie. Quelqu'un peut-il m'aider?

    Merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Erreur de syntaxe. Probablement qu'un identifiant n'est pas défini. Sans quelques lignes de code en plus, je ne peux pas t'aider plus.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Points : 88
    Points
    88
    Par défaut
    Ce ne serait pas juste une question de std:: ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::map < Str, Str, std::less < Str > > Table;

  4. #4
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Cette fois-ci, je donne un peu plus de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "str.h"
     
    using namespace std;
     
    class PropertyTbl {
    public:
     
        typedef map < Str, Str, less < Str > > Table;
        typedef Table::iterator Iter;
        typedef Table::const_iterator C_Iter;
        typedef const Str& Key;
        typedef Str Value;
    Selenite: Je pense que Str est défini par str.h.

    YéTeeh: compte-tenu du namespace std, je ne pense pas que le problème vienne de là.

  5. #5
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Je rajoute une question à la première. Si j'ai bien compris, "less" est un mot clé. Mais à quoi sert ce troisième type d'éléments du tableau?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Rajoute #include <map>.

    less n'est pas un mot clef, c'est un foncteur qui pourrait être défini ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<class T>class less
    {
      bool operator() (T& a, T& b) { return a < b; }
    }
    Tu n'est pas obiligé de mettre le 3eme argument de modèle.

  7. #7
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Le include y est déjà.

    Avec un compilateur plus récent, voici ce que j'obtiens:
    ISO C++ forbids declaration of `map' with no type
    error: expected `;' before '<' token
    pour la ligne commençant par: "typedef map...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    cf plus haut, map fait partie du namespace std, tu dois donc l'indiquer :
    en debut de fichier :
    using namespace std; // std pour tout le monde ( open() reste accessible par ::open(), par exemple)
    a chaque appel :
    std::map ...

  9. #9
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé mais çà change rien à la compilation...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    essaye un map<int,int>
    puis un map<string,string> (string def dans <string>, c'est quoi Str, un truc a toi ?)
    puis un map< string , string , less<string> >
    ...
    fais bien gaffe aux espaces autour de less<string> pour separer les >

    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map<a,b> est-i-il identique a map <a,b> ?

  11. #11
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Je me demande si cela ne viens pas de mon compilateur.
    C'est gcc version 2.7.2.3 ...

  12. #12
    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
    Citation Envoyé par C_R
    Je me demande si cela ne viens pas de mon compilateur.
    C'est gcc version 2.7.2.3 ...
    Ca a l'air assez vieux en effet. Pour s'en assurer il suffit de voir si ce code minimal compile ou non chez toi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <map>
     
    int main()
    {
        std::map<int, int> m;
        return 0;
    }
    Dans tous les cas, mettre à jour ton compilo ne serait pas une mauvaise idée.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Effectivement, il commence à se faire vieux ...

  14. #14
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Ca a pas l'air super simple de mettre à jour son compilo?

    Pour le bout de code à tester en compilation,est-ce normal que ça marche avec une commande g++ et que çà me donne ce qui suit avec la commance gcc:

    In file included from /usr/include/g++/stl_tree.h:56,
    from /usr/include/g++/map:31,
    from test.cpp:1:
    /usr/include/g++/stl_algobase.h:52: new.h: No such file or directory
    In file included from /usr/include/g++/stl_tree.h:58,
    from /usr/include/g++/map:31,
    from test.cpp:1:
    /usr/include/g++/stl_construct.h:34: new.h: No such file or directory

  15. #15
    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
    Bien sûr, gcc sert à compiler du C et g++ du C++.

  16. #16
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    OK
    Mais j'imagine que gcc switche de lui-même à g++ quand il voit l'extension cpp? Non?

  17. #17
    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
    Non, justement.

  18. #18
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut Résumé
    Pour ceux qui prennent le thread en route.

    Voici mon code:

    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
    #ifndef __CONFIG_H
    #define __CONFIG_H
     
    #include <stdio.h>
     
    #ifdef _WIN32
    #  ifdef _MSC_VER
    #    pragma warning(disable:4786)
    #  endif
    #  include <map>
    using namespace std;
    #endif
     
    #ifdef _LINUX
    #  include <map>
    #endif
     
    #include "str.h"
     
    using namespace std;
     
    class PropertyTbl {
    public:
     
        typedef map<Str, Str, less<Str> > Table;
        typedef Table::iterator Iter;
        typedef Table::const_iterator C_Iter;
    que je compile avec g++ 2.7.2.3. Ce qui me donne les messages suivants

    `less' was not declared in this scope
    parse error before `>'
    warning: ANSI C++ forbids typedef which does not specify a type
    parse error before `::'
    `int' is not an aggregate type
    warning: ANSI C++ forbids typedef which does not specify a type
    confused by earlier errors, bailing out
    Je voudrais surtout comprendre la première erreur.

  19. #19
    Membre habitué Avatar de ken_le_videur
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 129
    Points : 145
    Points
    145
    Par défaut
    Inclus le header fuctional:
    Et de toute façon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef map<Str, Str> Table;
    est équivalent puisque le type pas défaut sera, dans ce cas, less<Str>

  20. #20
    C_R
    C_R est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Voici le bout de code modifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "str.h"
     
    using namespace std;
     
    #include <functional>
     
    class PropertyTbl {
    public:
     
        typedef std::map< Str, Str > Table;
        typedef Table::iterator Iter;
        typedef Table::const_iterator C_Iter;
        typedef const Str& Key;
        typedef Str Value;
    et voici les messages du compilo:


    error: ISO C++ forbids declaration of `map' with no type
    error: template-id `map<Str, Str>' used as a declarator
    error: parse error before `;' token
    error: ISO C++ forbids declaration of `Table' with no type
    error: parse error before `::' token
    error: `int' is not an aggregate type
    error: ISO C++ forbids declaration of `const_iterator' with no
    Je comprend pas. Je ne vois pas ce qui foire. Arrêter moi si je me trompe :
    crée une spécialisation du template map. C'est donc sensé être un type et non un template-id.

    Merci de votre aide, d'avance.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. tableau associatif (map)
    Par phenix7598 dans le forum C
    Réponses: 7
    Dernier message: 08/12/2014, 13h20
  2. Réponses: 8
    Dernier message: 31/07/2009, 21h10
  3. Réponses: 4
    Dernier message: 28/08/2006, 09h10
  4. [langage] TRI TABLEAU ASSOCIATIF
    Par proner dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2003, 16h38
  5. [langage] Réinitialiser un tableau associatif.
    Par totox17 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2003, 16h29

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