Précédent   Forum des professionnels en informatique > C et C++ > Outils pour C & C++ > Visual C++ > C++/CLI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 21h26   #1
Invité régulier
 
Homme
Inscription : juillet 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 29
Points : 5
Points : 5
Par défaut Arguments pour pointeur de fonction

Bonjour,

J'ai une classe defini comme telle:

Code :
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 :
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 :
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.
MoonDragon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 23h18   #2
Membre émérite
 
Inscription : mars 2005
Messages : 853
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 853
Points : 957
Points : 957
Comme pour tout pointeur, ne pas oublier la bonne vieille esperluette...
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h42   #3
Invité régulier
 
Homme
Inscription : juillet 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 29
Points : 5
Points : 5
Peux tu etre plus explicite?
MoonDragon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 21h41   #4
Membre émérite
 
Inscription : mars 2005
Messages : 853
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 853
Points : 957
Points : 957
Code :
PayOff callPayOff(Strike, &digitaloptions);
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 12h20   #5
Invité régulier
 
Homme
Inscription : juillet 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 29
Points : 5
Points : 5
Nein, ca marche pas non plus.
MoonDragon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 19h04   #6
Membre émérite
 
Inscription : mars 2005
Messages : 853
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 853
Points : 957
Points : 957
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 :
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;
}
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h02   #7
Invité régulier
 
Homme
Inscription : juillet 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 29
Points : 5
Points : 5
Hello,

Merci pour ton aide. Voici les fichiers en question.
Fichiers attachés
Type de fichier : zip devcpp.zip (3,7 Ko, 1 affichages)
MoonDragon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 20h52   #8
Membre émérite
 
Inscription : mars 2005
Messages : 853
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 853
Points : 957
Points : 957
??????????

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.
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2012, 11h43   #9
Invité régulier
 
Homme
Inscription : juillet 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 29
Points : 5
Points : 5
Ah, c'est comme les petits fautes d'orhographes : soi meme on a du mal a le voir.

Encore merci pour ton aide.
MoonDragon est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h45.


 
 
 
 
Partenaires

Hébergement Web