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

Langage C++ Discussion :

Template à valeur pseudo-Dynamique.


Sujet :

Langage C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Template à valeur pseudo-Dynamique.
    Hello, je débute en C++, et me voila déjà bloqué

    Je cherche à utiliser un comparateur avec template, pour trier des tableaux.

    Cependant, je ne sais pas comment dire à mon compilo qu'une de mes variables local est en vérité un intervalle défini par un template.

    Voici la partie du code qui pose problème : :

    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
     
    template <int DIMCOUNT> class MyClass // 1er template
    {
    	typedef Node....
    	indexs *....
     
    	...
    	// Fonction de comparaison<CurrentDim>
    	template <int CurentDim>
    		struct My_less_equal: public std::binary_function<Node, Node, bool> {
    			bool operator()(const Node& _Left, const Node& _Right) const {
    				return (_Left.data[CurDim] <= _Right.data[CurDim]);
    			}
    	};
     
     
    	....
    	// ici le problème
    	for (unsigned i=1; i<DIMCOUNT; i++) {
    		std::sort(indexs[i][0], indexs[i][size], My_less_equal<i>());
    		// error C2971 une variable local ne peut pas être utilisé comme argument
    	}
    	// ne fonctionne pas
     
    	// J’aimerais qu'il fonctionne de la même manière que:		
    	std::sort(indexs[0][0], indexs[0][size], My_less_equal<0>()); //=> ok
    	std::sort(indexs[1][0], indexs[1][size], My_less_equal<1>()); //=> ok
    	std::sort(indexs[2][0], indexs[2][size], My_less_equal<2>()); //=> ok
    	// Version qui fonctionne pour DIMCOUNT = 3
    	...
    }
    Le compilateur n’a tout à fait tord, mais a la compilation une fois le code déroulé, ma variable litigieuse devient une constante.

  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
    Le paramètre d'un template ne peut pas être dynamique. Il doit être déterminé à la compilation. La raison est que le compilateur prends chaque My_less_equal<i> comme un type différent. A chaque fois qu'il rencontre un My_less_equal<i> avec une nouvelle valeur de i, il le compile. Ce processus de compilation ne peut évidemment pas se faire à l'exécution.

    Quand tu écris ceci (*), le compilateur n'est pas assez malin pour voir que i prend des valeurs entre 1 et DIMCOUNT. Et même s'il l'était, il ne connaitrait pas la valeur de DIMCOUNT. Il ne pourrait donc pas compiler tout les My_less_equal<i> correspondants.

    (*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (unsigned i=1; i<DIMCOUNT; i++)
          std::sort(indexs[i][0], indexs[i][size], My_less_equal<i>());

    Si DIMCOUNT est statique, tu peux utiliser des méthodes de méta-programmation.
    Mais avant tu doit surtout te demander si ton architecture est bonne, si tu as bien fait de mettre certains paramètre en templates.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    je me doutais un peu de la réponce.

    j'ai remplacé ma boucle par un :

    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
     
    		if (DIMCOUNT > 0) {
    			std::sort(indexs[0], indexs[0] + size, D_less_equal<0>());
    		} if (DIMCOUNT > 1) {
    			memcpy(indexs[1], indexs[0], sizeof(void *) * size);
    			std::sort(indexs[1], indexs[1] + size, D_less_equal<1>());
    		} if (DIMCOUNT > 2) {
    			memcpy(indexs[2], indexs[1], sizeof(void *) * size);
    			std::sort(indexs[2], indexs[2] + size, D_less_equal<2>());
    		} if (DIMCOUNT > 3) {
    			memcpy(indexs[3], indexs[2], sizeof(void *) * size);
    			std::sort(indexs[3], indexs[3] + size, D_less_equal<3>());
    		} if (DIMCOUNT > 4) {
    			memcpy(indexs[4], indexs[3], sizeof(void *) * size);
    			std::sort(indexs[4], indexs[4] + size, D_less_equal<4>());
    		} ...
    le résultats compilé est le meme si le compilot sais droper les block
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (0 == 1) { // false
    ...
    }
    La seul différance dans le code, est bien sur le nombre de ligne.
    C moins beau mais au moin ça marche.

    au final le code complet me donnera une class pour manipuler des ensembles de vecteur à DIMCOUNT dimension.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut Re: Template à valeur pseudo-Dynamique.
    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 My_less_equal: std::binary_function<Node, Node, bool>
    {
        My_less_equal(ssize_t dim) : dim_(dim) {}
     
        bool operator()(const Node& _Left, const Node& _Right) const
        { return (_Left.data[dim_] <= _Right.data[dim_]); }
    private:
        ssize_t dim_;
    };
    ...
    for (ssize_t i=1; i<DIMCOUNT; ++i)
    {
        std::sort(indexs[i][0], indexs[i][size], My_less_equal(i));
    }
    ?

    Mais ces manips me paraissent suspicieuses. Probablement de ne pas connaitre les types manipulés, ni ce qui doit être trié.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Effectivement le premier code ne fonctionnais pas :p
    mais apres debug, mon code fonctionne.

    la fnc de comparaison est devenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	typedef UPointPond<T,DIMCOUNT> Node;
    	typedef Node *PNode;
     
    	PNode *index; // je n'ai plus qu'un seul tableaux
     
    	template <int CurDim>
    	struct D_less_equal: public std::binary_function<PNode, PNode, bool>
    	{
    	bool operator()(const PNode& _Left, const PNode& _Right) const{	// apply operator<= to operands
    			return (_Left->data[CurDim] <= _Right->data[CurDim]);
    		}
    	};
    et pour le trie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		const int d = 0;
    		std::sort(index, index + _size, D_less_equal<d>());
    et la ça marche.

    je compte publier ma lib en Open source, une fois, fini, j'en ai mare de recoder les même chose pour chaque client.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci à ceux qui on essayé de m'aider, mais j'ai trouvé la solution.

    un code du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template<int DIMCOUNT>
     
     ...
      for (unsigned i=0; i<DIMCOUNT; i++) {
          fnc(i);
      }
     ...
     
     void fnc() {
       // code
     }

    ne fonctionne pas, par contre si on le réecrit de manière récursive, le compilo ne renvoie plus d'erreur:

    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
     
    template<int DIMCOUNT>
     
     ...
     fnc<DIMCOUNT-1>(); // remplace la boucle for
     ...
     
     template <int i>
       fnc() {
         // code
         fnc<i-1>(); // appel récursif
       }
     
     template <>
       fnc<0>() { // fin recursion
         // code
       }
    à part le fait que la boucle for soit parcouru à l'envers, le code produit est le meme.

    CQFD à suivre

Discussions similaires

  1. [MySQL] Re problème récupération valeur liste dynamique
    Par stefsas dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/03/2010, 08h58
  2. [XSL] - Valeur Width dynamique
    Par marcel_kobain dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/04/2009, 16h40
  3. Récupération valeur datagrid dynamique
    Par fanfan49 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 07/08/2007, 12h00
  4. Templates + Héritage + Allocation dynamique
    Par bouba dans le forum C++
    Réponses: 2
    Dernier message: 26/04/2007, 17h56
  5. [OpenTBS] Template et affichage dynamique de données
    Par touff5 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/05/2006, 19h16

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