GÉNÉRATEUR DE LANCÉS DE DÉS

trinitacs Messages postés 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 - 30 janv. 2003 à 14:00
Dragoon87 Messages postés 3 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 4 février 2003 - 3 févr. 2003 à 17:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10346-generateur-de-lances-de-des

Dragoon87 Messages postés 3 Date d'inscription jeudi 30 janvier 2003 Statut Membre Derniè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és 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 2
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és 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
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és 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 2
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és 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 2
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és 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
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és 11 Date d'inscription mardi 21 janvier 2003 Statut Membre Derniè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és 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 2
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.
Rejoignez-nous