Dragoon87
Messages postés3Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention 4 février 2003 3 févr. 2003 à 17:38
Merci beaucoup à trinitracs et kaid pour leurs suggestions et leur aide.
Je laisse le code en état pour que d'autre puisse bénéficier de leurs commentaires.
J'ai cependant reécrit ce code avec la solution de kaid et cela fonctionne très bien et c effectivement plus optimisé.
Portez vous bien
Dragoon
trinitacs
Messages postés249Date d'inscriptionmardi 16 juillet 2002StatutMembreDernière intervention 7 août 20032 1 févr. 2003 à 20:59
kaid << "trinitacs, bonne explication sur les pointeurs de fonctions."
Merci :)
Je suis d'accord que s'est stupide d'utiliser un tableau de pointeurs de fonctions ici.
kaid << "Conclusion, ma méthode est la plus optimisée et la plus simple :)"
Et il me nargues en plus :p
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 20061 1 févr. 2003 à 10:41
trinitacs, bonne explication sur les pointeurs de fonctions.
Le problème c'est que cette méthode n'est pas utilisable ici. Dans les autres sources on nous avons dissertés tous les deux sur l'utilisation ou non des pointeurs de fonctions, ils s'agissaient de switch() contenant des fonctions différentes et sans paramètres à chaque cas.
Or ici la fonction appelée est toujours la même, seul le paramètre change. Donc ton tableau de pointeurs de fonctions ne contiendra que 7 fois la même fonction et tu seras toujours obligé de faire l'association entre la valeur contenue dans le case et le paramètre de la fonction (certainement avec un tableau comme je l'ai fait).
Conclusion, ma méthode est la plus optimisée et la plus simple :)
trinitacs
Messages postés249Date d'inscriptionmardi 16 juillet 2002StatutMembreDernière intervention 7 août 20032 31 janv. 2003 à 17:09
j'ai oublié de précisé mais il faut vérifier si on ne sort pas du tableau avant l'appel, sinon, couic, hic, aie, pfff, boum.
Enfin l'os est là pour prévenir sur la plupart des segmentation fault, heureusement, ouf :)
trinitacs
Messages postés249Date d'inscriptionmardi 16 juillet 2002StatutMembreDernière intervention 7 août 20032 31 janv. 2003 à 16:57
kaid >> ;)
Je vais expliquer les pointeurs de fonctions dans un tableau. Pour éviter les déclaration trop hard (genre une fonction qui renvoie un pointeur de fonction) on va dire que chaque fonction ne prennent aucun argument et ne renvoie rien.
donc un prototype d'une fonction pouvant être pointé par le pointeur ressemblera à ça:
void nom();
et la déclaration du tableau de pointeur:
void ( *ptr[ 10 ] )() = { fonction1, fonction2, ... fonction9 };
le tableau de pointeurs a une longueur de 10 et il est initialisé en même temps que sa déclaration en écrivant juste le nom de chaque fonction.
Donc le [ 0 ] du tableau pointe sur fonction1, le [ 1 ] du tableau pointe sur fonction2 etc...
Ensuite tu appelle juste le pointeur et ça eppellera la fonction.
( *ptr[ numero ] )();
Il faut aussi savoir que l'utilisation des parenthèses est obligatoire dans la déclaration, sinon le sens change complètement.
On peut aller beaucoup plus loin avec les pointeurs de fonction mais c'est long de tout décrire.
voilà et vive les pointeurs de fonctions, hein kaid :)
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 20061 31 janv. 2003 à 11:05
Je suis là trinitacs ;) Dans ce cas là, effectivement il est plus intéressant d'utiliser un tableau mais sans pointeurs de fonction.
void Resultat(int a, int n)
{
static const int tab[]={-1, 4, 6, 8, 10, 12, 20, 100};
int de=tab[a];
cout << "Resultat du D"<< de <<: " << Aleatoire(de,n) << "
";
}
Bien entendu il faut tester si 'a' ne désigne pas un élément hors du tablau mais tu le fais déjà, donc c'est bon.
NeoWerner
Messages postés11Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention 1 juillet 2004 31 janv. 2003 à 10:59
Je trouve ton programme simpa !
Ca va m'aider parce que justement ce matin je cherchais un truc pour des nombres aléatoires.
Pour le stdio.h, j'ai essayé, et il ne sert effectivement a rien.
Mais j'ai une question pou trinitacs : je veux bien que tu precises pour remplacer le switch par un pointeur.
Merci !
trinitacs
Messages postés249Date d'inscriptionmardi 16 juillet 2002StatutMembreDernière intervention 7 août 20032 30 janv. 2003 à 14:00
Je n'ai pas vu ou tu utilises de pointeurs. Par contre tu peux en utiliser pour remplacer ton switch. En effet il est possible de faire un tableau de pointeurs ce qui est plus rapide qu'un switch. Je trouve ça aussi plus simple, par contre si kaid passe par là il te dira que c'est plus compliqué.
stdio ne te sert à rien dans cette source, ou alors je n'ai pas vu pourquoi.
Pour l'améliorer tu peux mettre un peu plus de fonction au lieu des do while. Mais ça viendra à force de programmer. es fonction peuvent renvoyer true et tu met un simple appel de ta fonction dans la condition du while ce qui aura pour conséquance d'alléger la lecture(pour les programmeurs) de la fonction main.
Pour optimiser tu peux appeller srand simplement au début du main. Ainsi tu apellera cette fonction simplement une seule fois dans ton programme et non pas plusieurs comme c'est le cas ici.
Si tu veux que je détaille certaines explication demande car je suis un peu bref là.
Dernier petit conseil pour mieux structurer tes programmes, tu peux mettre des espaces entre les opérateurs.
3 févr. 2003 à 17:38
Je laisse le code en état pour que d'autre puisse bénéficier de leurs commentaires.
J'ai cependant reécrit ce code avec la solution de kaid et cela fonctionne très bien et c effectivement plus optimisé.
Portez vous bien
Dragoon
1 févr. 2003 à 20:59
Merci :)
Je suis d'accord que s'est stupide d'utiliser un tableau de pointeurs de fonctions ici.
kaid << "Conclusion, ma méthode est la plus optimisée et la plus simple :)"
Et il me nargues en plus :p
1 févr. 2003 à 10:41
Le problème c'est que cette méthode n'est pas utilisable ici. Dans les autres sources on nous avons dissertés tous les deux sur l'utilisation ou non des pointeurs de fonctions, ils s'agissaient de switch() contenant des fonctions différentes et sans paramètres à chaque cas.
Or ici la fonction appelée est toujours la même, seul le paramètre change. Donc ton tableau de pointeurs de fonctions ne contiendra que 7 fois la même fonction et tu seras toujours obligé de faire l'association entre la valeur contenue dans le case et le paramètre de la fonction (certainement avec un tableau comme je l'ai fait).
Conclusion, ma méthode est la plus optimisée et la plus simple :)
31 janv. 2003 à 17:09
Enfin l'os est là pour prévenir sur la plupart des segmentation fault, heureusement, ouf :)
31 janv. 2003 à 16:57
Je vais expliquer les pointeurs de fonctions dans un tableau. Pour éviter les déclaration trop hard (genre une fonction qui renvoie un pointeur de fonction) on va dire que chaque fonction ne prennent aucun argument et ne renvoie rien.
donc un prototype d'une fonction pouvant être pointé par le pointeur ressemblera à ça:
void nom();
et la déclaration du tableau de pointeur:
void ( *ptr[ 10 ] )() = { fonction1, fonction2, ... fonction9 };
le tableau de pointeurs a une longueur de 10 et il est initialisé en même temps que sa déclaration en écrivant juste le nom de chaque fonction.
Donc le [ 0 ] du tableau pointe sur fonction1, le [ 1 ] du tableau pointe sur fonction2 etc...
Ensuite tu appelle juste le pointeur et ça eppellera la fonction.
( *ptr[ numero ] )();
Il faut aussi savoir que l'utilisation des parenthèses est obligatoire dans la déclaration, sinon le sens change complètement.
On peut aller beaucoup plus loin avec les pointeurs de fonction mais c'est long de tout décrire.
voilà et vive les pointeurs de fonctions, hein kaid :)
31 janv. 2003 à 11:05
void Resultat(int a, int n)
{
static const int tab[]={-1, 4, 6, 8, 10, 12, 20, 100};
int de=tab[a];
cout << "Resultat du D"<< de <<: " << Aleatoire(de,n) << "
";
}
Bien entendu il faut tester si 'a' ne désigne pas un élément hors du tablau mais tu le fais déjà, donc c'est bon.
31 janv. 2003 à 10:59
Ca va m'aider parce que justement ce matin je cherchais un truc pour des nombres aléatoires.
Pour le stdio.h, j'ai essayé, et il ne sert effectivement a rien.
Mais j'ai une question pou trinitacs : je veux bien que tu precises pour remplacer le switch par un pointeur.
Merci !
30 janv. 2003 à 14:00
stdio ne te sert à rien dans cette source, ou alors je n'ai pas vu pourquoi.
Pour l'améliorer tu peux mettre un peu plus de fonction au lieu des do while. Mais ça viendra à force de programmer. es fonction peuvent renvoyer true et tu met un simple appel de ta fonction dans la condition du while ce qui aura pour conséquance d'alléger la lecture(pour les programmeurs) de la fonction main.
Pour optimiser tu peux appeller srand simplement au début du main. Ainsi tu apellera cette fonction simplement une seule fois dans ton programme et non pas plusieurs comme c'est le cas ici.
Si tu veux que je détaille certaines explication demande car je suis un peu bref là.
Dernier petit conseil pour mieux structurer tes programmes, tu peux mettre des espaces entre les opérateurs.