C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Template et constante
Goto page 1, 2, 3, 4, 5  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Etienne Rousee
Guest





PostPosted: Sun Oct 29, 2006 10:48 pm    Post subject: Template et constante Reply with quote



Bonjour,

Le code suivant ne compile pas parce que
k n'est pas une constante:

template <int N> class Entier
{
.........
};

int k = 5;

Entier <k> l;

Y aurait il une autre construction permettant de faire ça ?
Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.

--

Etienne
Back to top
Manuel Zaccaria
Guest





PostPosted: Mon Oct 30, 2006 12:09 am    Post subject: Re: Template et constante Reply with quote



Etienne Rousee a écrit:
Quote:
Bonjour,

Bonjour,

Quote:

Le code suivant ne compile pas parce que
k n'est pas une constante:

template <int N> class Entier
{
........
};

int k = 5;

int const k = 5;

ou bien:

enum { k = 5 };

Du coup, k est une constante de compilation
et n'est plus modifiable par la suite.

Quote:

Entier <k> l;


-
Manuel Zaccaria
Back to top
Sylvain Togni
Guest





PostPosted: Mon Oct 30, 2006 12:11 am    Post subject: Re: Template et constante Reply with quote



Etienne Rousee a écrit :
Quote:
Le code suivant ne compile pas parce que
k n'est pas une constante:

template <int N> class Entier
{
........
};

int k = 5;

Entier <k> l;

Y aurait il une autre construction permettant de faire ça ?
Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.

Si k est une constante il faut la déclarer const pour que
cela fonctionne.

Sinon il faut trouver un moyen pour convertir le polymorphisme
statique (les templates) en polymorphisme dynamique (variant
pendant l'exécution). Par exemple :

switch(k)
{
case 1: {Entier<1> l; ...} break;
case 2: {Entier<2> l; ...} break;
case 3: {Entier<3> l; ...} break;
case 4: {Entier<4> l; ...} break;
case 5: {Entier<5> l; ...} break;
}

Mais si on en arrive là, il y a de fortes changes qu'il y ait
un problème de conception quelque part. Les templates ne sont
peut être pas la bonne solution.

--
Sylvain Togni
Back to top
Etienne Rousee
Guest





PostPosted: Mon Oct 30, 2006 4:40 am    Post subject: Re: Template et constante Reply with quote

"Sylvain Togni" <sylvain.togni (AT) NOSPAMwanadoo (DOT) fr> a écrit...
Quote:
Si k est une constante il faut la déclarer const pour que
cela fonctionne.

Ce n'est pas le cas, k peut être saisi par l'utilisateur.

Quote:
Sinon il faut trouver un moyen pour convertir le polymorphisme
statique (les templates) en polymorphisme dynamique (variant
pendant l'exécution). Par exemple :

switch(k)
{
case 1: {Entier<1> l; ...} break;
case 2: {Entier<2> l; ...} break;
case 3: {Entier<3> l; ...} break;
case 4: {Entier<4> l; ...} break;
case 5: {Entier<5> l; ...} break;
}

Ceci fait bien ce que je voudrais, mais il faudrais alors
que je mette des milliers de lignes dans mon switch.
Et ceci que pour l ....... Et il n'est pas seul ....

Quote:
Mais si on en arrive là, il y a de fortes changes qu'il y ait
un problème de conception quelque part. Les templates ne sont
peut être pas la bonne solution.

Peut-être bien, je vais réfléchir à la question.

--

Etienne
Back to top
Sylvain
Guest





PostPosted: Mon Oct 30, 2006 5:43 am    Post subject: Re: Template et constante Reply with quote

Etienne Rousee wrote on 29/10/2006 17:48:
Quote:

template <int N> class Entier
{
.........
};

int k = 5;
Entier <k> l;

Y aurait il une autre construction permettant de faire ça ?

"ça" est assez peu décrit par ce qui précéde!
quelles sont les occurences de 'N' dans le patron défini ? leur nombre,
leur implication par rapport à l'algorithmie de la classe, ... ?

plus avant que représente la classe Entier par rapport à un anneau?
s'il s'agit seulement d'un entier à qui pourra être appliqué mod N pour
déterminer si ce résultat est congru à la "caractéristique" N du
template, cela me parait un petit peu compliqué.

Quote:
Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.

si le paramètre template 'N' est le modulus de l'anneau, on pourra
surement définir:

class Entier {
private:
int n;
...
public:
Entier(int mod) : n(mod) { ... }
...
};

tous les calculs internes faisant intervenir n comme une donnée membre
seront codés à l'identique par substitution de N constante en ce n.

Sylvain.
Back to top
Vincent Lascaux
Guest





PostPosted: Mon Oct 30, 2006 6:07 am    Post subject: Re: Template et constante Reply with quote

Quote:
switch(k)
{
case 1: {Entier<1> l; ...} break;
case 2: {Entier<2> l; ...} break;
case 3: {Entier<3> l; ...} break;
case 4: {Entier<4> l; ...} break;
case 5: {Entier<5> l; ...} break;
}

Ceci fait bien ce que je voudrais, mais il faudrais alors
que je mette des milliers de lignes dans mon switch.
Et ceci que pour l ....... Et il n'est pas seul ....

Juste pour le fun:

template<int N>
struct EntierDynamique
{
static inline bool Execute(int n)
{
if (!EntierDynamique<N - 1>::Execute(N - 1) && n == N)
{
Entier<N> l; ...
return true;
}
else
return false;
}
};
template<>
struct EntierDynamique<0>
{
static inline bool Execute(int n)
{
return false;
}
};

EntierDynamique<100000>::Execute(k);

devrait être remplacé à la compilation par quelque chose qui ressemblerait à
ce code (mais ne l'est probablement pas vu que j'ai pas testé Razz)

if (k == 1)
{
Entier<1> l; ...
} else if (k == 2) {
Entier<2> l; ...
} else if (k == 3) {
Entier<3> l; ...
} else ..... {
} else if (k == 100000) {
Entier<100000> l; ...
}

et vaut true si k était dans 1 .. 100 000
Mais bon, bonjour le temps de compilation, la taille de l'exe Smile
En s'amusant on doit pouvoir obtenir une recherche un peu plus en arbre de
la bonne valeur... Je sais pas trop comment simuler un vrai switch avec les
templates par contre.

--
Vincent
Back to top
Loïc Joly
Guest





PostPosted: Mon Oct 30, 2006 6:44 am    Post subject: Re: Template et constante Reply with quote

Vincent Lascaux a écrit :
Quote:
struct EntierDynamique
{
static inline bool Execute(int n)
{
if (!EntierDynamique<N - 1>::Execute(N - 1) && n == N)
{
Entier<N> l; ...
return true;
}
else
return false;
}
};
template
struct EntierDynamique<0
{
static inline bool Execute(int n)
{
return false;
}
};

EntierDynamique<100000>::Execute(k);

devrait être remplacé à la compilation par quelque chose qui ressemblerait à
ce code (mais ne l'est probablement pas vu que j'ai pas testé Razz)

Il y a de fortes chances que ce genre de chose dépasse la profondeur
d'instanciation de template du compilateur. J'ai déjà vu du code qui ne
se basais pas sur du <N-1> mais sur du <N/2> (avec gestion des restes,
bien entendu) pour contourner ce genre de problème.

--
Loïc
Back to top
Etienne Rousee
Guest





PostPosted: Mon Oct 30, 2006 10:59 pm    Post subject: Re: Template et constante Reply with quote

"Sylvain" <noSpam (AT) mail (DOT) net> a écrit ...
Quote:
Etienne Rousee wrote on 29/10/2006 17:48:

template <int N> class Entier
{
.........
};

int k = 5;
Entier <k> l;

Y aurait il une autre construction permettant de faire ça ?

"ça" est assez peu décrit par ce qui précéde!
quelles sont les occurences de 'N' dans le patron défini ? leur nombre,
leur implication par rapport à l'algorithmie de la classe, ... ?

C'est le n de Z/nZ.

Quote:
plus avant que représente la classe Entier par rapport à un anneau?

Un "Entier" est un entier modulo N.

Quote:
s'il s'agit seulement d'un entier à qui pourra être appliqué mod N pour
déterminer si ce résultat est congru à la "caractéristique" N du
template, cela me parait un petit peu compliqué.

J'ai déjà surchargé tous les opérateurs algébriques pour cette
classe et tout marche quand on fait des déclarations avec N
en dur (constant) dans le programme.

Quote:
Mon contexte est l'implémentation des anneaux Z/nZ,
des polynômes à coeefficients là dedans, et de quelques
calculs de groupes.

si le paramètre template 'N' est le modulus de l'anneau, on pourra
surement définir:

class Entier {
private:
int n;
...
public:
Entier(int mod) : n(mod) { ... }
...
};

Ben oui, c'est ce qui m'ennuie, mais bon, tant pis.

--

Etienne
Back to top
Etienne Rousee
Guest





PostPosted: Mon Oct 30, 2006 11:15 pm    Post subject: Re: Template et constante Reply with quote

"Vincent Lascaux" <nospam (AT) nospam (DOT) invalid> a écrit ...
Quote:
Juste pour le fun:

template<int N
struct EntierDynamique
{
static inline bool Execute(int n)
{
if (!EntierDynamique<N - 1>::Execute(N - 1) && n == N)
{
Entier<N> l; ...
return true;
}
else
return false;
}
};
template
struct EntierDynamique<0
{
static inline bool Execute(int n)
{
return false;
}
};

EntierDynamique<100000>::Execute(k);

C'est amusant.
Sur mon système (W2000pro + VC6.0 + 512Mo),
on atteint les limites internes avec 280, alors 10000 !!...

--

Etienne
Back to top
Etienne Rousee
Guest





PostPosted: Mon Oct 30, 2006 11:17 pm    Post subject: Re: Template et constante Reply with quote

"Loïc Joly" <loic.actarus.joly (AT) numericable (DOT) fr> a écrit ...
Quote:
Il y a de fortes chances que ce genre de chose dépasse la profondeur
d'instanciation de template du compilateur.

Oui, c'est le cas à partir de N = 281.

Quote:
J'ai déjà vu du code qui ne se basais pas sur du <N-1
mais sur du <N/2> (avec gestion des restes,
bien entendu) pour contourner ce genre de problème.

Oui, mais ça reste inapplicable dans mon cas.
Je crois que je n'ai pas le choix, il faut que j'abandonne
les templates.

--

Etienne
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Tue Oct 31, 2006 12:52 am    Post subject: Re: Template et constante Reply with quote

"Etienne Rousee" <etienne (AT) rousee (DOT) org> writes:

Quote:
"Loïc Joly" <loic.actarus.joly (AT) numericable (DOT) fr> a écrit ...
Il y a de fortes chances que ce genre de chose dépasse la profondeur
d'instanciation de template du compilateur.

Oui, c'est le cas à partir de N = 281.

J'ai déjà vu du code qui ne se basais pas sur du <N-1
mais sur du <N/2> (avec gestion des restes,
bien entendu) pour contourner ce genre de problème.

Oui, mais ça reste inapplicable dans mon cas.
Je crois que je n'ai pas le choix, il faut que j'abandonne
les templates.

Qu'est-ce que tu voulais que les templates t'apportent?

A noter que:

template <int& N>
class foo { ... };

int x;

foo<x> bar;

est possible.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Back to top
Etienne Rousee
Guest





PostPosted: Tue Oct 31, 2006 2:22 am    Post subject: Re: Template et constante Reply with quote

"Jean-Marc Bourguet" <jm (AT) bourguet (DOT) org> a écrit ...
Quote:
les templates.

Qu'est-ce que tu voulais que les templates t'apportent?

Ça me paraissait la méthode adaptée à ce que je voulais,
la plus simple. Ce n'est peut-être pas le cas.

Quote:
A noter que:

template <int& N
class foo { ... };

int x;

foo<x> bar;

est possible.

Pas pour VC++ 6.0 (Je sais, c'est une pièce de musée).
Je vais essayer avec autre chose.
Au fait, que pensez vous (collectif) du nouveau turbo C++ ?

--

Etienne
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Tue Oct 31, 2006 2:46 am    Post subject: Re: Template et constante Reply with quote

"Etienne Rousee" <etienne (AT) rousee (DOT) org> writes:

Quote:
"Jean-Marc Bourguet" <jm (AT) bourguet (DOT) org> a écrit ...
les templates.

Qu'est-ce que tu voulais que les templates t'apportent?

Ça me paraissait la méthode adaptée à ce que je voulais,
la plus simple. Ce n'est peut-être pas le cas.

A noter que:

template <int& N
class foo { ... };

int x;

foo<x> bar;

est possible.

Pas pour VC++ 6.0 (Je sais, c'est une pièce de musée).

Je ne sais pas. Je ne l'ai jamais utilisé.

À noter qu'il faut que x soit une variable globale non statique.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Back to top
Sylvain
Guest





PostPosted: Tue Oct 31, 2006 2:58 am    Post subject: Re: Template et constante Reply with quote

Etienne Rousee wrote on 30/10/2006 18:15:
Quote:

Sur mon système (W2000pro + VC6.0 + 512Mo),
on atteint les limites internes avec 280, alors 10000 !!...

c'est ici la limite avec une heap de compilation par défaut (en principe
aux alentours de 105Mo).

le paramètre /Zm du compilo sert à définir en % l'allocation max.,
/Zm200 donne 200% de 100Mo soit 210Mo

le paramètre maximal documentée est 2000, avec 1400 (1,4Go) on peut
monter à N=10000 (+1 mn de compil).

Sylvain.
Back to top
Sylvain
Guest





PostPosted: Tue Oct 31, 2006 3:08 am    Post subject: Re: Template et constante Reply with quote

Etienne Rousee wrote on 30/10/2006 17:59:
Quote:

quelles sont les occurences de 'N' dans le patron défini ? leur nombre,
leur implication par rapport à l'algorithmie de la classe, ... ?

C'est le n de Z/nZ.

ok, je l'avais compris comme cela.
mais cela ne concerne que Entier, pas un anneau dont lequel il existe
peut-être, donc en reformulant, est-ce que N est vraiment le paramètre n
de "Z/nZ" et donc sera sûrement discret car premier (pour que l'anneau
soit un groupe) ou est-il seulement un paramètre (qlq) utilisé pour les
opérateurs mathématiques de Entier ?

ie
Entier<N> operator+ (Entier<N> const& a, Entier<N> const& b){
return Entier<N>((a + b) % N);
}

question subsidiaire, quelles est la limite de N ?
(32, 64 bits ou précision arbitraire ("BigInteger"))

Quote:
plus avant que représente la classe Entier par rapport à un anneau?

Un "Entier" est un entier modulo N.

reste un doute (ou je ne suis pas sur de bien comprendre)
Entier stocke-t-il la partie congrue à N d'un nombre (0 <= contenu de
Entier < N) ou stocke-t-il une valeur quelconque, le modulo
n'intervenant que dans les opérateurs numériques ?

Sylvain.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3, 4, 5  Next
Page 1 of 5

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.