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

C Discussion :

Gerer beaucoup d'option en evitant else if


Sujet :

C

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut Gerer beaucoup d'option en evitant else if
    Bonjour, je dois faire une fonction my_printf qui reproduit ce que fait printf. Pour le moment mon programme ne gere que 3 options. Et j'utilise des if et des else if, mais sachant que printf propose beaucoup de d'options, j'aimerais eviter d'utiliser des else if, y'a t'il une autre methode ?
    J'ai pas le droit d'utiliser le switch non plus et mes fonctions ne doivent pas depasser 25 lignes (-1 par lignes en trop)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 108
    Par défaut
    Options ?
    Qu'appelles-tu options ?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("%d", 666) //affiche des decimaux avec l'option %d
    printf("%s", "Hello") //affiche des chaines avec l'option %s
    Pour le moment je gere juste %d, %c et %s avec des if et else if, pour les reste des options il suffit de faire la meme chose, mais j'aimerais eviter d'avoir 20 else if

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nono212 Voir le message
    Options ?
    Qu'appelles-tu options ?
    Il doit probablement parler des formats "%d", "%f" etc...

    Citation Envoyé par jayfaze Voir le message
    Bonjour, je dois faire une fonction my_printf qui reproduit ce que fait printf. Pour le moment mon programme ne gere que 3 options. Et j'utilise des if et des else if, mais sachant que printf propose beaucoup de d'options, j'aimerais eviter d'utiliser des else if, y'a t'il une autre methode ?
    J'ai pas le droit d'utiliser le switch non plus et mes fonctions ne doivent pas depasser 25 lignes (-1 par lignes en trop)
    Utiliser un tableau de structure. Chaque structure associant à la fois
    - le format attendu
    - l'action associée au format sous forme de pointeur de fonction (tiens, ça me rappelle un autre topic dans le même genre => http://www.developpez.net/forums/sho...d.php?t=443335 à croire que tous les étudiants viennent ici se faire aider !!!)

    Ensuite, si ta fonction ne doit pas dépasser 25 lignes (???) ben rien ne t'interdit de réduire au maximum les lignes (supprimer les accolades dans les blocs qui n'ont qu'une seule instruction) et au pire de l'écrire sur une seule ligne !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut
    ok merci !
    à croire que tous les étudiants viennent ici se faire aider !!!
    Ouais, dans l'ecole de je suis on ne donne pas les cours avant l'exo, donc on doit se debrouiller par sois meme pour trouver la solution !
    Et on ne dois pas depasser les 25 lignes, je sais pas pourquoi !
    J'ai jamais fait de pointeur sur fonction, donc voila une occasion de taper dedans
    supprimer les accolades dans les blocs qui n'ont qu'une seule instruction)
    Ouais, je le fais deja

    et au pire de l'écrire sur une seule ligne
    Une ligne ne dois pas faire plus de 80 caracteres
    Avec ce que tu m'a dit, je pense m'en sortir sans avoir de point en moins !

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Je sais pas si réduire le nombre de lignes permettra de rendre le code plus clair.
    Ton école est bizarre.

    Juste pour info, un pointeur de fonction est une variable comme une autre, tu déclares un pointeur de fonction comme ça :

    type_de_retour (*nom_var)(type_param1, type_param2, ...);
    Ce qui donne par exemple pour une fonction prenant un nombre indéfini de paramètre et retourné un int :
    Ensuite, pour affecter une à ce pointeur c'est comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nomDeMaFonction(int var);
    // Plus loin...
    fonc = nomDeMaFonction;
    Il faut bien sûr que la fonction soit définie avant ou au moins prototypée. On remarque par la même occasion, que le nom de la fonction représente son adresse lorsqu'il n'y a pas les parenthèses.

    Et pour appeler une fonction affectée à un pointeur de fonction, il suffit de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = fonc(var1, var2);

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    Juste pour info, un pointeur de fonction est une variable comme une autre, tu déclares un pointeur de fonction comme ça :

    type_de_retour (*nom_var)(type_param1, type_param2, ...);
    Ce qui donne par exemple pour une fonction prenant un nombre indéfini de paramètre et retourné un int :
    Non ! Il n'y a pas "un nombre indéfini de paramètres", il n'y a pas de paramètre du tout !!!

    Citation Envoyé par PsychoH13 Voir le message
    On remarque par la même occasion, que le nom de la fonction représente son adresse lorsqu'il n'y a pas les parenthèses.
    C'est pour ça qu'on peut stocker cette adresse dans un "pointeur"

    Citation Envoyé par PsychoH13 Voir le message
    Et pour appeler une fonction affectée à un pointeur de fonction, il suffit de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = fonc(var1, var2);
    NON ! Il suffit de faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = (*fonc)(var1, var2);
    Puisque "fonc" représente un pointeur, pour appeler le pointé (le code de la fonction) il faut utiliser l'étoile (pointé)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Puisque "fonc" représente un pointeur, pour appeler le pointé (le code de la fonction) il faut utiliser l'étoile (pointé)
    Non justement pour un pointeur de fonction ça n'est pas nécessaire.
    De plus la notation int(*fonc)() est particulière et n'est pas équivalente à int(*fonc)(void) mais sert à simuler un pointeur générique de fonction.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Non ! Il n'y a pas "un nombre indéfini de paramètres", il n'y a pas de paramètre du tout !!!

    C'est pour ça qu'on peut stocker cette adresse dans un "pointeur"


    NON ! Il suffit de faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = (*fonc)(var1, var2);
    Puisque "fonc" représente un pointeur, pour appeler le pointé (le code de la fonction) il faut utiliser l'étoile (pointé)
    À tout ça je réponds un petit test :

    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
    #include <stdio.h>
     
    int f1(void)
    {
        return 5;
    }
     
    int f2(int var)
    {
        return var;
    }
     
    int main(void) {
    	int (*fptr1)();
        int (*fptr2)(void);
     
        fptr1 = f1;
        printf("%d\n", fptr1());
        fptr1 = f2;
        printf("%d\n", fptr1(6));
     
        fptr2 = f1;
        printf("%d\n", fptr2());
        fptr2 = f2; // warning: assignment from incompatible pointer type
        printf("%d\n", fptr1(6));
     
    	return 0;
    }
    Donc, lorsque j'affecte une fonction de type int (*)(void) à un pointeur de type int (*)(), il ne me dit rien, pas plus que lorsque la fonction prend un argument, donc c'est bien ce que je dis c'est un nombre indéfini d'arguments. Par contre, lorsque le pointeur de fonction est de type int (*) (void), là j'ai un warning lorsque j'affecte une fonction avec un argument.

    De plus, lorsque j'appelle mes fonctions à l'aide des pointeurs, je ne mets pas d'étoile, et ça marche quand même...

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    donc c'est bien ce que je dis c'est un nombre indéfini d'arguments.
    Ok, je savais pas...

    Citation Envoyé par PsychoH13 Voir le message
    De plus, lorsque j'appelle mes fonctions à l'aide des pointeurs, je ne mets pas d'étoile, et ça marche quand même...
    Ouaip. Tu peux aussi mettre 50 étoiles ça marche aussi. Mais ce n'est pas parce que "ça marche" que c'est "correctement écrit"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouaip. Tu peux aussi mettre 50 étoiles ça marche aussi. Mais ce n'est pas parce que "ça marche" que c'est "correctement écrit"...
    Pour les pointeurs de fonctions c'est pourtant strictement équivalent, et dans les deux cas (avec ou sans étoile) c'est "correctement écrit", à mon avis c'est simplement pour être cohérent avec le reste de la syntaxe des pointeurs que les opérateurs & et * sont définis pour les pointeurs de fonctions. Mais avec ou sans ces opérateurs, ça ne change rien, le seul endroit où l'étoile est nécessaire, c'est lors de la définition de la variable ou du type, dans le reste du code c'est juste pour faire jolie.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    à mon avis c'est simplement pour être cohérent avec le reste de la syntaxe des pointeurs que les opérateurs & et * sont définis pour les pointeurs de fonctions.
    Comme pour les tableaux si tu as "int tab[10]" ben tu peux afficher "tab" ou "&tab" t'auras la même valeur => l'opérateur "&" a été défini pour être cohérent avec le reste de la syntaxe. Mais si je vois écrit "&tab" j'aurai un doute sur ce qu'a voulu faire le programmeur alors que j'en n'aurai pas si je vois écrit "tab". Idem pour les fonctions. Si ptFct est un pointeur ben je préfère écrire "(*ptFct)()". Affaire de goût...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Comme pour les tableaux si tu as "int tab[10]" ben tu peux afficher "tab" ou "&tab" t'auras la même valeur => l'opérateur "&" a été défini pour être cohérent avec le reste de la syntaxe. Mais si je vois écrit "&tab" j'aurai un doute sur ce qu'a voulu faire le programmeur alors que j'en n'aurai pas si je vois écrit "tab". Idem pour les fonctions. Si ptFct est un pointeur ben je préfère écrire "(*ptFct)()". Affaire de goût...
    tab et & tab ne sont pas la même chose : le premier est du type int* et le second du type int(*)[10]. Ceci a son importance pour l'arithmétique des adresses, ainsi si tab et &tab correspondent à une même valeur "d'adresse", ce n'est pas le cas de tab+1 et (&tab)+1

    Pour les pointeurs de fonctions, je préfère la notation (*ptFct)() : La notation ptFct() peut fourvoyer le lecteur qui va peut être chercher quelque part et vainement une fonction ptFct()

  14. #14
    Inactif  
    Inscrit en
    Mars 2006
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 352
    Par défaut
    Bonjour,
    Citation Envoyé par jayfaze Voir le message
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("%d", 666) //affiche des decimaux avec l'option %d
    printf("%s", "Hello") //affiche des chaines avec l'option %s
    Pour le moment je gere juste %d, %c et %s avec des if et else if, pour les reste des options il suffit de faire la meme chose, mais j'aimerais eviter d'avoir 20 else if
    Tu peux utiliser un tableau de chaînes de caractères indexé par exemple de 0 à n - 1 (n étant le nombre d'options), puis tu indexes tes options (%s, %d ...) et c'est tout.

    Ta fonction prend comme argument l'option, elle recherche l'indexe de l'option ensuite accède au tableau pour récupérer la valeur et l'afficher !

    Bon courage !

    Cordialement,
    Sidahmed.

  15. #15
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    le principe général est celui des automates à états finis

    par ailleurs un switch sera souvent compilé en tableau de pointeurs (de saut dans le code et pas dans une fonction) donc pointeurs de fonction ou switch... c'est la même chose au final !

    "si tu as la flemme de faire l'exo", tape donc
    _doprnt sur google
    le 2ieme lien (koders.com) a l'air pas mal

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Citation Envoyé par jayfaze Voir le message
    Ouais, dans l'ecole de je suis on ne donne pas les cours avant l'exo, donc on doit se debrouiller par sois meme pour trouver la solution !
    quand on oublie, on évite de dire qu'on n'a pas eu les cours ....

Discussions similaires

  1. [RegEx] Eviter de répéter l'option \s (espace) ?
    Par FrontLine dans le forum Langage
    Réponses: 1
    Dernier message: 20/07/2008, 01h48
  2. Gerer par code les Options d'un DBGrid
    Par franck SEFIC dans le forum Delphi
    Réponses: 11
    Dernier message: 04/05/2007, 18h38
  3. Eviter 25 if else
    Par lechewal dans le forum C
    Réponses: 7
    Dernier message: 19/05/2006, 17h51
  4. [Forum] Gérer les if et else
    Par stomerfull dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 21
    Dernier message: 20/02/2006, 23h20
  5. gerer les ' dans une chaine pour eviter erreur sql
    Par Malone dans le forum Langage
    Réponses: 3
    Dernier message: 24/08/2005, 14h27

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