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 :

Comment appeler une fonction variable ?


Sujet :

C++

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut Comment appeler une fonction variable ?
    Bonjour,

    Voila j'ai plusieurs fonctions que je souhaiterais appeller en passant par une variable:

    En d'autres termes, je voudrais déclarer une variable de type "fonction"

    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
     
    //------------------------------------
    // Exemple de ce que je souhaiterais obtenir:
    //------------------------------------
    int fonction1(String S)
    {
    ...
    }
    int fonction2(String S)
    {
    ...
    }
    void main()
    {
      if (var1==1) MaFonction=fonction1;
      else MaFonction=fonction2;
     
      i=MaFonction("TEST");
    }
    Je sais comment faire en Delphi, mais comment proceder en C++builder ?
    Merci de votre aide
    franck

  2. #2
    Membre actif Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Points : 217
    Points
    217
    Par défaut
    Il faut utiliser les pointeurs de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int (*monpointeursurfonction)(String);
    monpointeursurfonction=fonction1;
    //appel de fonction1
    monpointeursurfonction("Test");
    monpointeursurfonction=fonction2;
    //appel de fonction2
    monpointeursurfonction("Test");

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Réponse claire, rapide et précise !!!
    Je l'ai essayé et ça marche.
    Merci à toi "Nyarlathotep"
    franck

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    En d'autres termes, je voudrais déclarer une variable de type "fonction"
    Ce n'est malheureusement pas vraiment possible en C++.

    Tu peux néanmoins avoir un type "fonction qui prend des paramètres de tels types et qui renvoit tel type".

  5. #5
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Citation Envoyé par loufoque
    Ce n'est malheureusement pas vraiment possible en C++.

    Tu peux néanmoins avoir un type "fonction qui prend des paramètres de tels types et qui renvoit tel type".
    Merci loufoque mais Nyarlathotep a répondu que c'était possible en utilisant les pointeurs de fonction (voir thread plus haut)
    cordialement
    franck

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    OK. Tu n'as pas compris mon message.
    La moindre des choses quand on répond, c'est de lire.

    La solution que t'as donnée Nyarlathotep utilise un type qui est "fonction qui prend un String et qui retourne un int".
    Comme je l'ai déjà dit, il n'est pas possible d'avoir un type "fonction" tout court, ce qui est ce que tu demandais.

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    On peut par contre 'tricher' avec les typedef :
    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
     
    #include <iostream> 
    typedef int MaFonction( int ); 
    int Incrementer( int a )
    {
     return ++a; 
    } 
     
    int Decrementer( int a ) 
    { 
    return --a; 
    } 
     
    int ModifierValeur( MaFonction aFonction, int aValeur ) 
    { return aFonction( aValeur ); 
    }
     
    int  main(void ) 
    { int a = 1; 
    std::cout<< ModifierValeur( Incrementer, a );
    std::cout<< ModifierValeur( Decrementer, a );
    return 0; 
    }

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    En quoi tu triches ?
    De toute manière, dans cet exemple, on pourrait utiliser les templates, ce qui nous permettrait de travailler avec des fonctions ayant n'importe quelle signature...

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Je considère que je triche dans le sens où , mon code n'utilise pas de pointeur de fonction mais arrive quand même au résultat.

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Davidbrcz
    Je considère que je triche dans le sens où , mon code n'utilise pas de pointeur de fonction mais arrive quand même au résultat.
    C'est tout comme. Rajoute une étoile dans ton typedef et ce sera un pointeur de fonction.

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    ouais.

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

Discussions similaires

  1. Comment appeller une fonction dynamiquement, à partir d'un argument
    Par Invité dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/04/2006, 16h47
  2. Réponses: 2
    Dernier message: 13/03/2006, 13h54
  3. comment appeler une fonction JAVA en JAVASCRIPT ?
    Par heleneh dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 13/09/2005, 12h21
  4. comment appeler une fonction JAVA en JAVASCRIPT ?
    Par heleneh dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/09/2005, 12h04
  5. Comment appeler une fonction JavaScript depuis Delphi ?
    Par Alfred12 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 17/06/2005, 18h15

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