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++/CLI Discussion :

Arguments pour pointeur de fonction


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut Arguments pour pointeur de fonction
    Bonjour,

    J'ai une classe defini comme telle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <PayOff1_Ex21.h>
    #include <MinMax.h>
     
    PayOff::PayOff(double Strike_, double (*f_)(double ,double ))
    {
    	Strike = Strike_;
    	FunctionPtr = f_;
    }
     
    double PayOff::operator ()(double spot) const
    {
    	return FunctionPtr(Strike , spot);
     
    }
    Mais j'ai un probleme d'arument (je pense) lorsque j'essaye de l'appeller dans le code ci-dessous:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include<SimpleMC_Ex21.h>
    #include<iostream>
    using namespace std;
     
    double digitaloptions(double , double );
     
    int main()
    {
     
    	double Expiry;
    	double Strike; 
    	double Spot; 
    	double Vol; 
    	double r; 
    	unsigned long NumberOfPaths;
     
    	cout << "\nEnter expiry\n";
    	cin >> Expiry;
     
    	cout << "\nEnter strike\n";
    	cin >> Strike;
     
    	cout << "\nEnter spot\n";
    	cin >> Spot;
     
    	cout << "\nEnter vol\n";
    	cin >> Vol;
     
    	cout << "\nr\n";
    	cin >> r;
     
    	cout << "\nNumber of paths\n";
    	cin >> NumberOfPaths;
     
        PayOff callPayOff(Strike, digitaloptions);
        PayOff putPayOff(Strike, digitaloptions);
     
    	double resultCall = SimpleMonteCarlo2(callPayOff,
                                              Expiry,                                           
    							              Spot, 
    							              Vol, 
    							              r, 
    						                  NumberOfPaths);
     
        double resultPut = SimpleMonteCarlo2(putPayOff,
                                             Expiry,                                           
    							             Spot, 
    							             Vol, 
    							             r, 
    						                 NumberOfPaths);
     
    	cout <<"the prices are " << resultCall << "  for the call and " 
                                        << resultPut << " for the put\n";
     
        double tmp;
        cin >> tmp;
     
    	return 0;
     
    }
     
    double digitaloptions(double Spot_d, double Strike_d)
    {
    	//return max(Spot_d-Strike_d,0);
     
    	return 0;
     
    }
    Le message d'erreur que j'obtiens est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1>SimpleMCMain2_Ex21.cpp
    1>c:\moondragon\distancelearning\cpp\code\chap2.1\simplemcmain2_ex21.cpp(35) : error C2664: 'PayOff::PayOff(double,double (__cdecl *)(double,double))' : cannot convert parameter 2 from 'double' to 'double (__cdecl *)(double,double)'
    1> There is no context in which this conversion is possible
    1>c:\moondragon\distancelearning\cpp\code\chap2.1\simplemcmain2_ex21.cpp(36) : error C2664: 'PayOff::PayOff(double,double (__cdecl *)(double,double))' : cannot convert parameter 2 from 'double' to 'double (__cdecl *)(double,double)'
    1> There is no context in which this conversion is possible
    1>Build log was saved at "file://c:\MoonDragon\DistanceLearning\cpp\code\chap2.1\Debug\BuildLog.htm"
    1>chap2.1 - 2 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    D'avance merci pour votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Comme pour tout pointeur, ne pas oublier la bonne vieille esperluette...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Peux tu etre plus explicite?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PayOff callPayOff(Strike, &digitaloptions);

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Nein, ca marche pas non plus.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Juste comme ça, ça va être difficile de t'aider.

    Ou tu fournis un code complet.

    Ou tu isoles le problème dans un petit source.

    Ou tu fais de l'objet (on est en C++ après tout) avec de l'héritage et une méthode virtuelle en lieu et place de ton pointeur de fonction f.

    Pour information, ce code fonctionne. A vrai dire, l'esperluette n'est pas obligatoire pour un pointeur de fonction mais j'avais un doute pour Visual.
    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
     
    #include <iostream>
     
    class PayOff {
    public:
      PayOff(double s, double (*f)(double, double)) {
        std::cout << f(s, s) << std::endl;
      }
    };
     
    double digitaloptions(double a, double b) {
      return a * b;
    }
     
    int main() {
      PayOff payoff(2.0, &digitaloptions);
      return 0;
    }

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Hello,

    Merci pour ton aide. Voici les fichiers en question.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    ??????????

    Il compile très bien ton code. Il y a juste une erreur de link sur le constructeur SimpleMonteCarlo2(PayOff const&, double, double, double, double, unsigned long). L'argument strike est en trop dans le .cpp.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Ah, c'est comme les petits fautes d'orhographes : soi meme on a du mal a le voir.

    Encore merci pour ton aide.

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

Discussions similaires

  1. Type d'argument pour appel de fonction dans une DLL
    Par Lio590 dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 06/07/2011, 16h28
  2. [DOM] Onmouseover pour lancer une fonction avec arguments
    Par Trock dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 01/06/2007, 13h31
  3. pb de pointeur de fonction pour thread
    Par melleb dans le forum MFC
    Réponses: 2
    Dernier message: 09/02/2007, 16h46
  4. Type de class et arguments pour fonctions et new
    Par Alfred12 dans le forum C++
    Réponses: 15
    Dernier message: 19/01/2007, 01h02
  5. [debutant] correspondance JAVA C++ pour pointeur de fonction
    Par davidoff_tls dans le forum Langage
    Réponses: 7
    Dernier message: 15/04/2004, 09h13

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