Dll C++ dans vb, tableau 2D en paramètre [Résolu]

Signaler
Messages postés
32
Date d'inscription
dimanche 12 juin 2005
Statut
Membre
Dernière intervention
26 juin 2007
-
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
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

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
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
Messages postés
32
Date d'inscription
dimanche 12 juin 2005
Statut
Membre
Dernière intervention
26 juin 2007

En passant le premier element d'une matrice 2D ( exemple : tab(1,1) ) le programme plante alors que en 1d cela marche.
Messages postés
32
Date d'inscription
dimanche 12 juin 2005
Statut
Membre
Dernière intervention
26 juin 2007

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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
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
Messages postés
32
Date d'inscription
dimanche 12 juin 2005
Statut
Membre
Dernière intervention
26 juin 2007

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.
Messages postés
32
Date d'inscription
dimanche 12 juin 2005
Statut
Membre
Dernière intervention
26 juin 2007

Oui je travaille en base 1.
Merci , ca marche parfaitement.
Messages postés
32
Date d'inscription
dimanche 12 juin 2005
Statut
Membre
Dernière intervention
26 juin 2007

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 
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
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