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

Langage C++ Discussion :

[Langage] Comment créer des fonctions qui sont des variables


Sujet :

Langage C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut [Langage] Comment créer des fonctions qui sont des variables
    Bonjour

    Je voudrais créer des variables qui sont en fait des fonctions mathématiques.

    Ceci est un code Maple, et c'est exactement ce que je veux faire:
    La variable g[1,2] est une fonction par morceaux qui dépend de x.

    g[1,2]:=unapply(piecewise(x<1,0,x=>1,1),x):

    Si on fait g[1,2](2), on obtient la valeur de cette fonction en 2, c'est a dire 1.

    Comment faire ceci en C++? Je penche pour des pointeurs de fonctions.

    Par exemple, je pourrait créer un prototype d'une telle fonction, qui prend des paramètres abstraits.
    Lors de l'instantiation de fonctions, je précise les paramètres qui vont avec cette fonction. Je pourrais ainsi appeler à n'importe quel moment du code la fonction. Je pourrais aussi la détruire...
    Qu'en pensez vous?

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    des foncteurs iraient effectivement, mais tu dois pour le cas de ton g créer une matrice de foncteurs avec des double en argument.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    par foncteurs tu veux dire pointeurs vers des fonctions ?

    créer une matrice de foncteurs avec des double en argument.
    La matrice servirait à stocker les fonction g[i,j]_{i,j}??

    As tu un exemple de foncteur?
    merci

  4. #4
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Voila ce que j'ai fait:

    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
    double f(double x,double param){
    	if(x<0){return 0;}
    	if(x>1){return 0;}
    	if(x<0.5){return param;}
    	if(x>=0.5){return 1-param;}
     
    }
     
    double fonction2(double a1,double a2,double a3,double m,double x){
    	if(x<a1){return 0;}
    	if(x>a3){return 0;}
    	if(x<a2){return f(x,m)*m;}
    	if(x>=a2){return f(x,m)*(1-m);}
    }
     
    int main(){
    	double *g=new double[100];
    	fonction2 *tableau=new fonction2[100];
    	double (*p)(double,double,double,double,double);
    	p=&fonction2;
    	cout<<(*p)(2,3,4,2,4);
    return 0;
     
    }
    ensuite j'aimerais créer un tableau dont les case contiennent le pointeur vers la fonction g. (en gros, la fonction g elle-même).
    Je me suis basé sur double *g=new double[100]; pour faire: fonction2 *tableau=new fonction2[100];

    mais bien sur fonction2 n'est pas un type de C++
    Alors faut il créer un typdef, enfin qqch comme ca pour créer un type?

  5. #5
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    dans ton cas, je mettrais pour g:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef double (*Tonpointeur)(double);
    Tonpointeur **g=new Tonpointeur*[largeur]
    for(int i=0; i<largeur;++i)
           g[i]=newTonpointeur[longeur]
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  6. #6
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ahhh j'y étais presque
    j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     typedef double (*t)(double,double,double,double,double);
    ca compile, mais je ne sais pas quoi ca fait.
    que signifie la ligne de code ci dessus par rapport à la tienne?

  7. #7
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    ca créé un type qui est un pointeur sur fonction ce que tu as fait
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Tu as deux solutions : les pointeurs de fonctions, comme déjà expliqué, ou bien les foncteurs, qui sont plus dans l'esprit C++.

    http://cpp.developpez.com/faq/cpp/?page=STL#STL_functor

  9. #9
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ca créé un type qui est un pointeur sur fonction ce que tu as fait
    Ben, lui ca fait quoi?
    ca crée un type qui est?
    pour moi ce qu'il a fait, c'est un type qui est une fonction qui renvoie un double.

  10. #10
    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
    Cette ligne déclare un alias de type nommé t sur le type "pointeur vers fonction prenant cinq double en paramètre et retournant un double".
    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.

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef double (*funcPtr)(double);
     
    double fonction1(double toto){ return toto; }
    double fonction2(double toto){ return toto*2; }
     
    //Puis plus loin dans ton code :
     
    funcPtr mafonction = fonction1;
    //funcPtr mafonction = fonction2; peut convenir aussi.
    std::cout << mafonction(3.2) << std::endl; //Cette ligne va appeler fonction1 avec un code tel quel.

  12. #12
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Si tu manipules des éléments de type pointeur de fonctions, tu ne pourras presque rien faire comme manipulation.

    Composition, application partielle de fonction...

    Tu devrais passer par boost::function<>, qui acceptent tout foncteur ou pointeur de fonction.

  13. #13
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    oui, mais alors comment déclarer par exemple g[2][2]?
    tel que je le désire, g[2][2] doit être un pointeur sur fonction, et on doit l'appeller n'importe quand dans le code.

  14. #14
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Si tu manipules des éléments de type pointeur de fonctions, tu ne pourras presque rien faire comme manipulation.

    Composition, application partielle de fonction...
    ok mais BOOST c'est vachement compliquer a installer, et utiliser

    mais moi, je veux effectivement faire un appel de fonction partiel par exemple on a:

    la fonction fx,y)->5*x+y;

    je veux créer la fonction g(x)=f(5,x) et h(x)=f(4,x)

    puis plus tard faire la somme de g(x) et h(x) pour x=4 par ex

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Tu devrais passer par boost::function<>, qui acceptent tout foncteur ou pointeur de fonction.
    Ca + boost::bind voir même boost.lambda en plus, ça devrait aller effectivement

  16. #16
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par deubelte Voir le message
    ok mais BOOST c'est vachement compliquer a installer, et utiliser

    mais moi, je veux effectivement faire un appel de fonction partiel par exemple on a:

    la fonction fx,y)->5*x+y;

    je veux créer la fonction g(x)=f(5,x) et h(x)=f(4,x)

    puis plus tard faire la somme de g(x) et h(x) pour x=4 par ex
    Les modules dont tu as besoin sont header-only... Autrement dit, tu as juste à les inclure, il n'y a rien à lier.

  17. #17
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ok je verrais, mais si on en revient a nos moutons,

    j'ai fait ca comme code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    double fonction2(double a1,double a2,double a3,double m,double x){
    	if(x<a1){return 0;}
    	if(x>a3){return 0;}
    	if(x<a2){return f(x,m)*m;}
    	if(x>=a2){return f(x,m)*(1-m);}
    }
     
    	typedef double (*Tonpointeur)(double);
         Tonpointeur **g=new Tonpointeur*[6];
    	 for(i=0;i<6;i++){
     		 g[i]=new Tonpointeur[largeur]; 
     	}
    maintenant, comment définir par exemple g[0][0]??
    merci

  18. #18
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par deubelte Voir le message
    maintenant, comment définir par exemple g[0][0]??
    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double f(double d) { return 0.1*x; }
    g[0][0] = &f;

  19. #19
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    j'ai fait:

    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
    double fonction2(double a1,double a2,double a3,double m,double x){return 2*x;} 
     
     
     
    int main(){
    	double m1,m2,m3,m4,m5;
    	m1=0;m2=0.25;m3=0.5;m4=0.75;m5=1;
     
    	double largeur=pow((int) 2,(double) 5);
          long j,i;
     
        typedef double (*Tonpointeur)(double);
        Tonpointeur **g=new Tonpointeur*[6];
        for(i=0;i<6;i++){
     		 g[i]=new Tonpointeur[largeur]; 
     	}
     
        g[0][0]=&fonction2;
       double *gl=new double[100];
     
    return 0;
     
    }
    ca me renvoie une erreur:

    error C2440: '='*: impossible de convertir de 'double (__cdecl *)(double,double,double,double,double)' en 'Tonpointeur'

  20. #20
    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
    Ben, c'est normal: Tonpointeur est un alias sur le type "pointeur vers une fonction qui prend un seul double en paramètre et retourne un double", et tu cherches en faire pointer un vers une fonction qui prend cinq double en paramètre...
    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.

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/05/2013, 09h59
  2. Comment créer une fonction d'archivage des entrées
    Par vietzims dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/05/2008, 23h15
  3. Réponses: 2
    Dernier message: 22/10/2007, 17h50
  4. Comment créer une fonction qui retourne un tableau?
    Par Dereck07 dans le forum Delphi
    Réponses: 4
    Dernier message: 26/04/2007, 13h16
  5. Creer des fonctions qui émule des fonctions Access
    Par steelidol dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/05/2006, 18h42

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