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 :

Prototype de fonction difficile à comprendre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut Prototype de fonction difficile à comprendre
    Chères amies, chers amis du forum

    voici un prototype de fonction que je ne comprend pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void prog_dyn ( t_noeud * const arbre , double (* phi ) ( double ) , double p ) ;
    Mon problème c'est l'instruction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double (* phi ) ( double )
    ,
    avec phi une fonction de type phi(x)=(x-100). je ne comprend pas comment implémenter une telle fonction, de plus je souhaite remplacer 100 par une variable K.

    Merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Tu sembles pourtant bien avoir compris qu'il s'agit d'un pointeur sur fonction dont tu peux fournir une valeur à prog_dyn de la manière suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    double phiPhi(double x)
    {
        return x - 100;
    }
     
    int main(int, char **)
    {
        prog_dyn(0, phiPhi, 250);
        return 0;
    }
    Pour remplacer 100 par K, c'est plus difficile. Je te propose ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template< int K >
    static double louLou(double x)
    {
        return x - K;
    }
     
    int main(int, char **)
    {
        prog_dyn(0, louLou<40>, 250);
    }
    La curryfication a toutefois ses limites en C++...

  3. #3
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Merci

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    La curryfication a toutefois ses limites en C++...
    T'as aussi le droit de faire un bind.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    double f(double x, double factor)
    {
        return x - factor;
    }
     
    prog_dyn(0, boost::bind(f, _1, 40), 250);

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    J'étais en train de faire le deuxième exemple de Chatanga (juste pour entrainement) et je ne vois pas du tout pourquoi on voudrais faire en utilisant le template, à la place d'utiliser simplement un argument de plus à la fonction (plus proche du dernier exemple avec le bind (et là, je me dis ... le bind me semble totalement inutile )).

    Pouvez vous m'expliquer un peu plus en détails s'il vous plait, pourquoi chercherai t'on à passer par un template, à la place d'ajouter un argument en plus.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Pouvez vous m'expliquer un peu plus en détails s'il vous plait, pourquoi chercherai t'on à passer par un template, à la place d'ajouter un argument en plus.
    Parce que prog_dyn a simplement besoin d'une fonction phi:a->b et n'a pas à gérer des passages de paramètres supplémentaires qui n'ont aucun sens pour elle. Imaginons une implémentation de phi qui irait récupérer sa valeur de retour dans un fichier quelconque ; prog_dyn devrait-elle accepter un nouvel argument filename uniquement pour ça ?

    Sinon, utiliser boost::bind est assurément plus puissant que ma solution, d'autant que les paramètres autres que des entiers pourront être utilisés (dans mon exemple, K ne peut même pas être un double).

  7. #7
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Cheres amies, chers amis du forum

    J'ai toujours un peu de mal dans l'utilisation de cette fonction, je l'ai modifié un peu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    void noeud::pricing (noeud *const arbre ,void (*phi)(noeud,double), double p,double r );
    avec phi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    void noeud::phi (noeud *const arbre,double K);
    et dans le main lorsque j'appelle cette fonction dans le main j'ai une erreur qui s'affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    node->pricing(node,(node,875),0.75,0.8);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2664: 'noeud::pricing' : impossible de convertir le paramètre 2 de 'int' en 'void (__cdecl *)(noeud,double)
    Merci

Discussions similaires

  1. [POO] Prototypes de fonctions et IE
    Par T.NightGlow dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 15/01/2008, 16h50
  2. definition prototypes de fonctions dans main
    Par fantomas261 dans le forum C
    Réponses: 4
    Dernier message: 19/10/2007, 11h18
  3. Question sur les prototypes de fonctions
    Par GnuVince dans le forum Langage
    Réponses: 2
    Dernier message: 23/11/2006, 23h37
  4. .net prototype de fonction
    Par stgi02 dans le forum MFC
    Réponses: 1
    Dernier message: 13/04/2006, 22h41
  5. prototype de fonction ?
    Par salseropom dans le forum C
    Réponses: 3
    Dernier message: 07/04/2006, 10h01

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