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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Private Declare Function FonctionTest Lib "MaDll.dll" (FirstElement As Double) As Double
et ensuite je copie les valeur de la plage dans un tableau:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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

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
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.