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 :

[d�butant] priority file et red�finition de la comparaison


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm� Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par d�faut [d�butant] priority file et red�finition de la comparaison
    Bonjour,
    Je souhaite utiliser une priority file de la STL, y placer des variables de type Sommet, et avoir comme crit�re de priorit� un des champs de la structure Sommet. Je n'arrive pas � trouver la syntaxe correcte. Ce que j'ai trouv� dans la faq m'a plus embrouill� qu'aid� car c'est la premi�re fois que j'utilise la STL et les tempaltes, et j'ai encore du mal � comprendre...

    voil� ce que j'ai �crit:

    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 cmp {
             bool operator ()(const Sommet& s1 , const Sommet& s2)
             {
                  return(s1.abs < s2.abs);
             };
      };
     
      typedef std::priority_queue<Sommet,
                                  deque<Sommet>,
                                  cmp<Sommet>
                                 > file;
     
      file tas;
    et j'ai comme message d'erreur : non-template type `cmp' used as a template . Que dois-je changer dans mon code?
    Merci d'avance

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    typedef std::priority_queue<Sommet,
                                  deque<Sommet>,
                                  cmp
                                 > file;
    Puisque cmp n'attend aucun param�tre template.

  3. #3
    Membre confirm� Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par d�faut
    merci beaucoup, c'�tait pas tr�s compliqu�
    mais j'ai une autre question

    je voudrais ne pas faire porter le crit�re de priorit� sur un des champs de Sommet, mais sur la case d'un tableau dont l'indice d�pend des champs de Sommet (c'est un peu tordu mais j'ai pas vraiment trouv� d'autre solution)

    en fait, tout �a se trouve dans une m�thode, j'ai un tableau que je d�clare au d�but de la m�thode:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    int* tab= new int[n]
    et ensuite

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      struct cmp {
             bool operator ()(const Sommet& s1 , const Sommet& s2 )
             {
                  return(tab[s1.x]>tab[s2.x]);
             };
      };
     
      typedef std::priority_queue<Sommet,
                                  deque<Sommet>,
                                  cmp
                                 > file;
    est-ce que cela est possible? our l'instant il n'a pas l'air de l'accepter, j'ai de nombreux messages d'erreur � la compilation
    merci d'avance

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Un type utilis� comme param�tre template ne peut pas �tre un type local � une fonction, donc non ce n'est pas possible.

    Par contre rien ne t'emp�che de passer ton tableau en param�tre du foncteur, via son constructeur.

    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
    struct cmp
    {
        cmp(const int* T) : tab(T) {}
     
         bool operator ()(const Sommet& s1 , const Sommet& s2 ) const
         {
              return(tab[s1.x]>tab[s2.x]);
         }
     
    private :
     
        const int* tab;
    }; 
     
    typedef std::priority_queue<Sommet,
                                  deque<Sommet>,
                                  cmp
                                 > file;
     
    int* tab = new tab[n]; // pourquoi pas un std::vector ?
     
    file MaFile(cmp(tab)); // constructeur de std::priority_queue à vérifier, mais ça devrait être ça

  5. #5
    Membre confirm� Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par d�faut
    j'ai � la compilation le message d'erreur:

    Dijkstra.cpp: In method `void Dijkstra::cout (TableauBiDim, TableauBiDim)':
    Dijkstra.cpp:60: template-argument `Dijkstra::cout (TableauBiDim, TableauBiDim)::cmp' uses local type `Dijkstra::cout (TableauBiDim, TableauBiDim)::cmp'
    Dijkstra.cpp:60: confused by earlier errors, bailing out

    o� Dijkstra::cout est la m�thode o� se trouve tout �a, et la ligne 60 celle o� il y a " > file; "

  6. #6
    Membre confirm� Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par d�faut
    bon, j'ai r�gl� le probl�me pr�c�dent, il fallait juste sortir tout �a de la m�thode dans laquelle �a se trouvait

    donc 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
      struct cmp {
     
             cmp(const S* T} : tab(T) {}
     
             bool operator ()(const Sommet& s1 , const Sommet& s2) const
             {
     
                     return(tab[s1.x]>tab[s2.x]);
     
             }
      private:
      	const S* tab;
      };
     
      typedef std::priority_queue<Sommet,
                                  deque<Sommet>,
                                  cmp
                                 > file;
     
    void A::B()
    {
      int m=5;
     
      S* traites= new S[m];
     
      file tas (traites);
     
      ...
    }
    compile

    mais en fait je voudrais aussi passer en param�tre l'entier m pour pouvoir avoir dans operator () quelque chose de la forme tab[s1.x*m]

    mais quand je compile:

    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
     
      struct cmp {
     
             cmp(const S* T , const int x} : tab(T) , m(x) {}
     
             bool operator ()(const Sommet& s1 , const Sommet& s2) const
             {
     
                     return(tab[s1.x]>tab[s2.x]);
     
             }
      private:
      	const S* tab;
                    const int m;
      };
     
      typedef std::priority_queue<Sommet,
                                  deque<Sommet>,
                                  cmp
                                 > file;
     
    void A::B()
    {
      int m=5;
     
      S* traites= new S[m];
     
      file tas (traites,m);
     
      ...
    }
    j'ai le message d'erreur : no matching function for call to `priority_queue<Sommet, deque<Sommet, allocator<Sommet>, 0>, cmp>::priority_queue (S *&, int)

    o� est l'erreur ?

  7. #7
    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 : 51
    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
    Par d�faut
    Citation Envoy� par Romain93
    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
     
      struct cmp {
             cmp(const S* T} : tab(T) {}
             /**/  };
      typedef std::priority_queue<Sommet,
                                  deque<Sommet>,
                                  cmp
                                 > file;
     
    void A::B()
    {
      int m=5;
      S* traites= new S[m];
      file tas (traites);
      ...
    }
    Ici, le code marche, mais pas comme tu le penses. L'argument attendu par le constructeur de ta priority_queue est un objet du type cmp. Il se trouve que comme cmp a un constructeur � un seul argument, de type S*, non d�clar� explicit (essaye d'ajouter ce mot clef devant le constructeur pour voir), ce constructeur peut servir � convertir implicitement un S* en cmp. C'est ce qui se passe.

    Citation Envoy� par Romain93
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      struct cmp {
               cmp(const S* T , const int x} : tab(T) , m(x) {}
      };
     
    void A::B()
    {
      int m=5;
      S* traites= new S[m];
      file tas (traites,m);
      ...
    }
    Ici, un constructeur � 2 param�tre ne peut plus servir � la conversion. Et tu passes deux param�tres au constructeur de priority_queue qui n'en attend qu'un seul. Donc boom.

    La solution : Lui passer un objet de type cmp que tu auras construit explicitement avec les bonnes valeurs :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
      file tas (cmp(traites,m));
    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.

  8. #8
    Membre confirm� Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par d�faut
    bien vu, merci beaucoup
    au d�but j'avais bien mis file tas (cmp(traites)); maisj'avais chang� parceque �a compilait pas alors qu'en fait c'�tait pour autre chose

    bref, merci beaucoup!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [LabView 8.5][D�butant] Probl�me file d'attente
    Par yoann23 dans le forum LabVIEW
    R�ponses: 20
    Dernier message: 27/03/2008, 18h55
  2. [MEX] [D�butant] Mex files
    Par brel380 dans le forum MATLAB
    R�ponses: 4
    Dernier message: 11/06/2007, 15h09
  3. [D�butant] Pointeur FILE dans une fonction
    Par Dexter00 dans le forum C
    R�ponses: 8
    Dernier message: 29/08/2006, 21h37
  4. [d�butant]class File : delete/renameTo()
    Par Zazawitch dans le forum Entr�e/Sortie
    R�ponses: 2
    Dernier message: 23/01/2006, 21h36
  5. [D�butant][JNDI] Erreur "bad class file"
    Par giffle dans le forum Eclipse Java
    R�ponses: 2
    Dernier message: 05/01/2005, 10h23

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