Voici mon problème. J'ai ce code en C:
J'écris un wrapper en C#. Voici ce que j'ai:
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 GTO_EXPORT(int ) GtoCapFloorAvgVol( TDate capStartDate, /* (I) */ TDate capExpiryDate, /* (I) */ double *strikeRates, /* (I) */ int numStrikeRates, /* (I) */ double *principles, /* (I) */ int numPrinciples, /* (I) */ int moneymarketDen, /* (I) # days/year */ TDateInterval *resetPeriod, /* (I) Time Between caplets */ int optionType, /* (I) Cap or Floor */ char stubPosition, /* (I) 2/16/94 GG 'F'ront or 'B'ack */ TCurve *zeroCurve, /* (I) For discounting */ double price, /* (I) Price */ double avgVolGuess, /* (I) Average Volatility guess */ double *avgVol); /* (O) Average Volatility */ Et voici les structs: typedef struct _TCurve { int fNumItems; /* Number of TRatePts in fArray */ TRatePt *fArray; /* Dates & rates */ TDate fBaseDate; /* Discount date */ double fBasis; /* Number compounding periods / year */ long fDayCountConv; /* How the year fraction is computed */ void *fClassHandle; /* C++ class handle implementation */ } TCurve; typedef struct { TDate fDate; double fRate; } TRatePt; et j'ai typedef long int TDate;
Pour l'appel de la fonction je fais ça:
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 [DllImport("alib.dll", EntryPoint = "GtoCapFloorAvgVol")] public static extern int CapFloorAvgVol( long capStartDate, /* (I) */ long capExpiryDate, /* (I) */ double[] strikeRates, /* (I) */ int numStrikeRates, /* (I) */ double[] principles, /* (I) */ int numPrinciples, /* (I) */ int moneymarketDen, /* (I) # days/year */ ref TDateInterval resetPeriod, /* (I) Time Between caplets */ int optionType, /* (I) Cap or Floor */ char stubPosition, /* (I) 2/16/94 GG 'F'ront or 'B'ack */ [In] IntPtr zeroCurve, /* (I) For discounting Pointer to TCurve*/ double price, /* (I) Price */ double avgVolGuess, /* (I) Average Volatility guess */ out double avgVol); /* (O) Average Volatility */ [StructLayout(LayoutKind.Sequential)] public struct TRatePt { public long fDate; public double fRate; }; public struct TCurve { public int fNumItems; /* Number of TRatePts in fArray */ public TRatePt[] fArray; /* Dates & rates */ public long fBaseDate; /* Discount date */ public double fBasis; //ZERO_CURVE_BASIS in capvoll.c which is #defined as ANNUAL_BASIS 1 /* Number compounding periods / year */ public long fDayCountConv; //ZERO_CURVE_DAY_COUNT_CONV in capvoll.c which is #defined as GTO_ACT_365F; = 2L /* How the year fraction is computed */ public IntPtr fClassHandle; /* C++ class handle implementation */ };
En gros je déclare un pointeur et le passe à la fonction. Maintenant, j'ai un problème au niveaus du fArray... Côté C il ne contient pas du tout les bonnes valeures. Du coup j'ai du me tromper quelque part? Peut-être que je dois rajouter un MarshalAs dans TCurve mais je vois pas quoi?
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 //create zeroCurve with data above and then does the necessary for it to be a pointer as required by C++ dll TCurve _zeroCurve = new TCurve() { fBaseDate = _tempValueDate, fNumItems = _tempZeroCurveDates.Length, fArray = _ratePoints, fBasis = 2L, fDayCountConv = 1 }; int _sizeOfTCurve = Marshal.SizeOf(typeof(TCurve)); IntPtr p_zeroCurve = Marshal.AllocHGlobal(_sizeOfTCurve); Marshal.StructureToPtr(_zeroCurve, p_zeroCurve, false); int _status = CapFloorAvgVol(_tempStartDate, _temPexpiryDate, strikeRates, strikeRates.Length, principles, principles.Length, moneymarketDen, ref _resetPeriod, optionType, stubPosition, p_zeroCurve, price, avgVolGuess, out avgVol);
Est-ce que je l'ai bien défini? Dois-je aussi le définir en tant que pointeur dans TCurve? Je l'ai pas fait parce que je pense les membres sont blittable donc devrait pouvoir être passé directement non?
PS: dsl pour les quelques mots d'anglais, je ne connais pas le vocabulaire en français...
Merci d'avance au courageux qui voudraient bien m'aider.
Partager