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
et ensuite je copie les valeur de la plage dans un tableau:Code:Private Declare Function FonctionTest Lib "MaDll.dll" (FirstElement As Double) As Double
Coté C++Code:
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
Code: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
Code coté C++ j'essaye juste de changer les valeurs de la plage en mettant tout à 10Code:
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
Voila, j'utilise la librairie ATL de Visual. pour l'instant cette solution ne fonctionne pas, je ne trouve pas l'erreur.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 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); }
Je vous remercie pour votre aide.