Voici mon problème. J'ai ce code en C:
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;
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
 
        [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 */
    };
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
 
//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);
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?

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.