Aide déboggage - template Fibonacci
Résolu/Fermé
Utilisateur anonyme
-
3 mai 2013 à 07:20
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 - 5 mai 2013 à 13:10
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 - 5 mai 2013 à 13:10
A voir également:
- Aide déboggage - template Fibonacci
- Modifier template word - Guide
- Sommaire word template - Guide
- Template organigramme word - Guide
- Facture template gratuit - Télécharger - Tableur
- Template qcm - Télécharger - Études & Formations
3 réponses
mamiemando
Messages postés
33381
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 novembre 2024
7 802
Modifié par mamiemando le 4/05/2013 à 23:42
Modifié par mamiemando le 4/05/2013 à 23:42
C'est normal, la résolution des templates se fait à la compilation, pas à l'exécution. Ce qu'il faut bien comprendre avec les templates, c'est qu'ils servent à déclarer des types "générique". Supposons que je déclare une liste qui dépende d'un paramètre template (la nature des élémetns listés). Alors si j'utilise list<int>, list<float>, list<mon_type_t> tout se passe comme si je compilais trois classes.
Dans le cas qui nous occupe les templates permettent (même si ce n'est pas un moyen très naturel) de résoudre le problème si l'entier est connu à la compilation. On va donc pour la valeur n = 3 engendrer la compilation de fibo<3>, fibo<2> et fibo<1>.
Maintenant si n est précisé à l'exécution, on est coincé, car on ne sait pas jusqu'à quelle profondeur d'imbrication il faut compiler. En d'autre termes, si la valeur de n n'est pas connue à la compilation, cette approche ne peut pas marcher.
Dans ton cas, si la suite doit être calculée en fonction d'un paramètre connu seulement à l'exécution il faut trouver une autre approche (par exemple une fonction récursive).
Bonne chance
Dans le cas qui nous occupe les templates permettent (même si ce n'est pas un moyen très naturel) de résoudre le problème si l'entier est connu à la compilation. On va donc pour la valeur n = 3 engendrer la compilation de fibo<3>, fibo<2> et fibo<1>.
Maintenant si n est précisé à l'exécution, on est coincé, car on ne sait pas jusqu'à quelle profondeur d'imbrication il faut compiler. En d'autre termes, si la valeur de n n'est pas connue à la compilation, cette approche ne peut pas marcher.
Dans ton cas, si la suite doit être calculée en fonction d'un paramètre connu seulement à l'exécution il faut trouver une autre approche (par exemple une fonction récursive).
Bonne chance
Utilisateur anonyme
5 mai 2013 à 07:58
5 mai 2013 à 07:58
Je te remercie de ta réponse, mais tu as tort. Je me suis deboggee toute seule entretemps.
Pour avoir une fonction qui affiche une valeur template passée à l'exécution, il faut lui définir un maximum. Ma fonction printFibo devient :
Template <int i>
void printFibo (int j)
{
if (j>100) { return fibo<100>();}
(la même chose)
}
Et définir printFibo<100>.
Comme ça ça marche. Ce qui ne marche pas, c'est une fonction template sans maximum.
Cordialement,
Mare
Pour avoir une fonction qui affiche une valeur template passée à l'exécution, il faut lui définir un maximum. Ma fonction printFibo devient :
Template <int i>
void printFibo (int j)
{
if (j>100) { return fibo<100>();}
(la même chose)
}
Et définir printFibo<100>.
Comme ça ça marche. Ce qui ne marche pas, c'est une fonction template sans maximum.
Cordialement,
Mare
mamiemando
Messages postés
33381
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 novembre 2024
7 802
5 mai 2013 à 13:10
5 mai 2013 à 13:10
Bonjour Marie,
Pas vraiment envie de rentrer dans un débat qui a tort et qui a raison, mais vu que ta solution ne marche que si n est inférieur à 100, ce n'est pas vraiment ce que j'appelle "marcher". Toutefois merci pour cette précision car je pensais pas que ce genre de solution pouvait marcher :-)
Ceci dit, garde en tête que les templates ne servent pas à traiter ce genre de problème. Donc on peut les utiliser pour résoudre le problème de manière un peu originale, dans la vraie vie on ne coderait pas une suite de Fibonacci comme cela.
Les templates récursifs sont par exemple correctement utilisés dans boost pour définir la méthode get<int i> pour récupérer le i-ème élément d'un tuple template.
https://stackoverflow.com/questions/7157210/boostbind-doesnt-work-with-boosttuplegetn
Bonne chance
Pas vraiment envie de rentrer dans un débat qui a tort et qui a raison, mais vu que ta solution ne marche que si n est inférieur à 100, ce n'est pas vraiment ce que j'appelle "marcher". Toutefois merci pour cette précision car je pensais pas que ce genre de solution pouvait marcher :-)
Ceci dit, garde en tête que les templates ne servent pas à traiter ce genre de problème. Donc on peut les utiliser pour résoudre le problème de manière un peu originale, dans la vraie vie on ne coderait pas une suite de Fibonacci comme cela.
Les templates récursifs sont par exemple correctement utilisés dans boost pour définir la méthode get<int i> pour récupérer le i-ème élément d'un tuple template.
https://stackoverflow.com/questions/7157210/boostbind-doesnt-work-with-boosttuplegetn
Bonne chance