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 :

Rediriger le pointeur d'une fonction vers une autre


Sujet :

C

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Rediriger le pointeur d'une fonction vers une autre
    Bonjour à tous,
    Mon titre n'est peut-être pas très clair, je vais tâcher de préciser.
    J'aimerais dans un programme, tester un flag, et suivant celui-ci utiliser une fonction, ou une autre.
    Je vous vois venir avec vos grands sabots "un if, else et le tour est joué !".
    Ouep, mais je dois le faire environ 50 fois dans le programme...

    Donc, l'idée est la suivante, chacune des deux fonctions est identique au nom près dans leur prototypes.
    Du coup, je ne sais pas comment déclarer fonction, si je la déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void fonction1(int a, int b);
    void fonction2(int a, int b);
    ??? fonction;
    Mais ensuite, dans mon programme, je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (flag) {
    <div style="margin-left:40px">fonction = fonction1;</div>} else {
    <div style="margin-left:40px">fonction = fonction2;</div>}
    Et enfin, à chaque appel, j'utilise fonction, et non fonction1 ou fonction2.

    J'espère que c'est assez clair... .
    Ce n'est pas simple à expliquer .

    Merci d'avance de vos réponses !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il faut utiliser une typedef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef void montype(int, int);
    montype *mafonction;
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Trap D
    Il faut utiliser une typedef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef void montype(int, int);
    montype *mafonction;
    Pas obligatoirement :

    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
    29
     
    #include <stdlib.h>
    #include <stdio.h>
     
    void fonction1(int a, int b)
    {
       printf("Soustraction : %d\n",a-b);
    }
     
    void fonction2(int a, int b)
    {
       printf("Addition : %d\n",a+b);
    }
     
    int main(int argc, char **argv)
    {
      void (*fct)(int,int);
     
      if(argc != 1 ) {
        fct = &fonction1;
      }
      else {
        fct = &fonction2;
      }
     
      fct(5,4);
     
      return EXIT_SUCCESS;
    }
    Jc

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, tu pourrais déclarer ton pointeur comme cela:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* Il me semble que tu n'est pas obligé de virer les noms des paramètres:
       Ils seront ignorés, c'est tout. */
    void (*fonction)(int, int);

    Mais pour les pointeurs de fonction, l'expérience m'a montré qu'il valait mieux toujours passer par un typedef, sinon on se retrouve avec des aberrations comme la fonction standard signal() :
    Code C horrible : Sélectionner tout - Visualiser dans une fenêtre à part
    void ( *signal(int sig, void (*func)(int)) )(int);

    Tandis qu'avec un typedef, on se simplifie les choses:
    Code C avec typedefs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef void (*FONCTION2INT)(int, int);
    typedef void (*FONCTIONSIGNAL)(int);
     
    FONCTIONSIGNAL signal(int sig, FONCTIONSIGNAL func);
     
    FONCTION2INT fonction;


    Edit: Wow, double cross post.
    Trap D, tu es sûr que ton typedef marche sans étoile ni parenthèses? Je n'ai jamais vu cette syntaxe dans le moindre manuel...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Merci Médinoc
    fearyourself
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par Médinoc
    Edit: Wow, double cross post.
    Trap D, tu es sûr que ton typedef marche sans étoile ni parenthèses? Je n'ai jamais vu cette syntaxe dans le moindre manuel...
    Oui, cela fonctionne très bien. Je fais aussi souvent la même chose, trouvant cette écriture la plus propre (le type pointeur n'est pas caché).

    A+

  7. #7
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Merci, c'est simple finalement .
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Testé sous Visual C6
    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
    #include <stdio.h>
     
    typedef void montype(int, int);
    montype *mafonction;
     
    void fonc1(int a, int b)
    {
      printf("Fonc1 %d %d\n", a, b);
    }
     
    void fonc2(int a, int b)
    {
      printf("Fonc2 %d %d\n", a, b);
    }
     
     
    int main(void)
    {
    	montype *f;
    	f = fonc1;
    	f(1,2);
    	f = fonc2;
    	f(1,2);
    	return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Pointeur vers une table dans une fonction
    Par Chatbour dans le forum Oracle
    Réponses: 2
    Dernier message: 03/05/2007, 12h28
  3. lien vers une ancre dans une fonction ???
    Par jojodunord dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 23/12/2005, 00h45
  4. lien vers une ancre dans une fonction ????
    Par jojodunord dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/12/2005, 23h42
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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