Dll C++ dans vb, tableau 2D en paramètre

Résolu
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007 - 26 mars 2007 à 09:27
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 27 mars 2007 à 23:23
Bonjour,

je souhaite faire passer un tableau 2D de double à partir de Vb pour appeler une dll c++. Je sais que pour les tableaux à une dimension il suffit de passer le premier element du tableau mais comment faire pour les tableaux 2D ?

Merci.

9 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 mars 2007 à 10:26
Erreur grave, dans ton code....
ReDim S(3, 3)
fais un tableau de 4x4 cases (sauf si tu as un Option Base 1)

quoi qu'il en soit....

tiens, c'est plus simple ainsi :

void BH ( LPSAFEARRAY* signaux )
{
// Si on a bien un tableau de longs à deux dimensions...
 if ((*signaux)->cDims==2 && (*signaux)->cbElements==4)
 {
  long nCountX = (*signaux)->rgsabound[1].cElements;
  long nCountY = (*signaux)->rgsabound[0].cElements;


  SafeArrayLock(*signaux);
  long *pElements = (long*)(*signaux)->pvData;
 
  for( long y=0;y<nCountY;y++ )
   for( long x=0;x<nCountX;x++ )
    pElements[(y*nCountX)+x] = x*y;


  SafeArrayUnlock(*signaux);
 }
}

en VB:



Private Declare Sub
BH Lib "G:\Signaux_dll\debug\Signaux_dll.dll" (ByRef Signaux() As Long)

Private Sub Form_Load()
Dim xnSignaux(2, 5) As Long
   BH xnSignaux
End Sub<hr />,

----

By Renfield



plus besoin de passer le premier element, tu passe ton tableau, quelle que soit sa taille ^^

pense bien a utilise __stdcall comme convention d'appel dans ta dll

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 mars 2007 à 12:05
pareil.... les données sont contigues en mémoire, quoi qu'il en soit.

passes egalement les dimensions de ta matrice.
gaffe, cependant, je crois que VB et C gèrent pas les tableaux dans le meme sens...
en gros, ce que tu aura en
array(x,y) en VB sera en array(y,x) en C

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
26 mars 2007 à 12:48
En passant le premier element d'une matrice 2D ( exemple : tab(1,1) ) le programme plante alors que en 1d cela marche.
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
26 mars 2007 à 15:56
J'ai cette fonction c++

void ff ( int **signaux )
{
for( int i=0;i<2;i++ )
   {
      for( int j=0;j<2;j++ )
      {
      signaux[i][j]=i*j;
      }
}
}

et en vba :
call ff(tablo(1,1)) et ca plante, pourquoi ?
 
Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 mars 2007 à 19:49
donne moi la déclaration de ta fonction en VB1, ainsi que le code qui entoure l'appel (declaration du tableau, etc)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
27 mars 2007 à 09:18
Voici le code : 

En VBA :


 Private Declare Sub BH Lib "G:\Signaux_dll\debug\Signaux_dll.dll" (ByRef Signaux As Long)
 
 Dim S() As Long
 ReDim S(3, 3)
 S(1, 1) = 0
 
 Call BH(S(1, 1))


 

En C++ :


void BH(int **Signaux){
for (int i=0;i<3;i++)
{
 for (int j=0;j<3;j++)
 {
  Signaux[i][j]=i*j;
 }
}




Merci.
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
27 mars 2007 à 10:58
Oui je travaille en base 1.
Merci , ca marche parfaitement.
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
27 mars 2007 à 13:40
Par contre, n'y a t'il pas un autre moyen que pElements[(y*nCountX)+x] pour gérer les cases du tableau. Ne peut on pas utiliser pElements[y][x] ?

Merci 
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 mars 2007 à 23:23
non... pElements est un simple pointeur de Long.
il ignore que tu manipule un tableau, derrière...

je ne pense pas que cela soit reelement génant, si ?

au pire, fais une Macro, pour rendre la chose plus lisible...

#define Signal(x,y) pElements[(y*nCountX)+x]

et dans le code :

  for( long y=0;y<nCountY;y++ )
   for( long x=0;x<nCountX;x++ )
    Signal(x,y) = x*y;

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous