Bonjour,
J'ai un problème pour faire tourner un algorithme en C++, cet algorithme doit recevoir des données depuis une feuille Excel, par l'intermédiaire d'une fonction en vb qui appelle la fonction C++, lui passe les tableaux en paramètres et reçois le résultat sous forme de Double. j'ai beaucoup chercher sur le net, mais je n'ai trouvé aucune solution qui fonctionne vraiment pour mon cas. J'ai tout de même réussis à passer un tableau depuis Excel vers le code C++ :
Coté vb
Private Declare Function FonctionTest Lib "MaDll.dll" (FirstElement As Double) As Double
et ensuite je copie les valeur de la plage dans un tableau:
1 2 3 4 5 6 7 8 9 10 11 12
|
Public Function MA_FonctionTest
Nx1 = x1a.Rows.Count
If x1a.Columns.Count <> 1 Then Exit Function 'Si plus d'une colonne, sort de la procédure
ReDim zx1(Nx1) As Double
i = 0
For Each c1 In x1a 'Parcourt la plage
zx1(i) = c1.Value 'Affecte au tableau
i = i + 1
Next c1
MA_FonctionTest = FonctionTest(zx1(0)
end function |
Coté C++
MaDll_API double _stdcall FonctionTest(double *plArrayOfLongs)
mais je ne voie pas comment je peut faire pour passer une matrice, comment allouer une plage 2 dimensions à un tableau en vb ?
Sinon j'essaye de faire autrement; avec une SafeArray, je crois que se serait la meilleur solution si elle marchait :
Code Coté VB
1 2 3 4 5 6 7 8 9 10 11
| Public Sub TP_GetArray()
Dim vValues As Variant
vValues = Range("A46:K56")
GetArray (vValues)
End Sub |
Code coté C++ j'essaye juste de changer les valeurs de la plage en mettant tout à 10
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
| TP_API void _stdcall GetArray(VARIANT* pValues)
{
CComSafeArray<double> Array;
CComSafeArrayBound Bounds[2];
// la dimension correspondant aux lignes
Bounds[0].SetLowerBound(0);
Bounds[0].SetCount(50);
// la dimension correspondant aux colonnes
Bounds[1].SetLowerBound(0);
Bounds[1].SetCount(2);
Array.Create(Bounds,2);
for(int i = 0;i<=50;i++)
{
long date_Idx[2] = {i,0};
long value_Idx[2] = {i,1};
Array.MultiDimSetAt(date_Idx,10);
Array.MultiDimSetAt(value_Idx,10);
}
VariantInit(pValues);
pValues->vt = VT_ARRAY | VT_R8;
Array.CopyTo(&pValues->parray);
} |
Voila, j'utilise la librairie ATL de Visual. pour l'instant cette solution ne fonctionne pas, je ne trouve pas l'erreur.
Je vous remercie pour votre aide.
Partager