Passage de tableaux de structure entre vba et dll c++

vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007 - 28 mars 2007 à 17:06
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007 - 2 avril 2007 à 14:38
Bonjour

je passe un tableau de type utilisateur via une dll c++ dont voici la structure simplifiée :

Private Type A
      aa as long
      aaa() as long
end type

en c ++ :
struct A{
   long aa;
   long* aaa;
};

Ensuite dans mon code c++, je fais le code suivant :

A *elt;
for (int i=0;i<N;i++)
   for (int i=0;i<NN;i++)
   cout << elt[i].aaa[j];

Ce code tourne mais elt[i].aaa[j] retourne toujours 1.69801e-313 alors que dans vba on peut voir qu'il contient bien des long.

Merci.

17 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2007 à 17:10
A *elt;
for (int i=0;i<N;i++)
   for (int i=0;i<NN;i++)
   cout << elt[i].aaa[j];

tu initialise pas elt ? il pointe où il veux ? dansgereux !

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
28 mars 2007 à 17:22
En fait je fais juste A* elt;
SafeArrayAccessData(*List,(void**)&elt);

A quoi dois je initialiser elt ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2007 à 17:41
je vois avec plaisir que tu t'es renseigné sur les SafeArray, depuis hier ^^

donne mois un peu plus de ton de code (VB et C)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2007 à 17:43
NB: j'espere que tu a bien le SafeArrayUnaccessData our contrebalancer ton SafeArrayAccessData ...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

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

Posez votre question
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
28 mars 2007 à 18:01
oui, je l'ai.

Voici plus de code.

C++ :

struct A{
   long aa;
   long* tableau;
};

void BH(SAFEARRAY** List, long N, long NN){ 

Instrument *elt;
SafeArrayAccessData(*List,(void**)&elt);

for (int i=0;i<N;i++)
   for (int j=0;j<NN;j++)
   cout << elt[i].aaa[j];

}

En Vba :

Private Type A
      aa as long
      tableau() as long
end type

Private Declare Sub BH "G:\Signaux_dll.dll" (ByRef List() As Instrument,ByVal N As Long, ByVal NN As Long)

Dim List() as A
Dim N,NN as Long
N=2
NN=6
Redim List(N)

for i = 1 to N
   Redim List(i).tableau(NN);
next i

for i = 1 to N
   for j = 1 to NN
      List(i).tableau(j) = 2
  next j
next i

Call BH(List,N,NN)

Merci
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
28 mars 2007 à 18:04
Correction : Private Declare Sub BH "G:\Signaux_dll.dll" (ByRef List() As A,ByVal N As Long, ByVal NN As Long)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2007 à 19:30
on prend les mêmes...

struct A{
   long aa;
   SAFEARRAY** tableau;
};

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
29 mars 2007 à 08:56
VBA :
Private Type A
      aa as long
      tableau() as long
end type

et C++:
struct A{
   long aa;
   SAFEARRAY** tableau;
};

Le probleme apres c'est que elt[i].aaa[j] = 0 ( par exemple ) renvoie  le message :"Cannot convert from int to SAFEARRAY*"
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
29 mars 2007 à 09:03
J'ai réglé le probleme du message précédent.

Par contre malgré le passage en Safearray** tableau, l'affichage des données donne maintenant non plus 1.69801e-313 mais 00800001.

Merci
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
29 mars 2007 à 10:02
Le problème doit venir des données de elt[i].tableau[j]. Faut il faire un SafeArrayAccessData() sur les tableaux de la liste de structures A pour y accéder ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2007 à 12:24
oui...

je te l'ai dit : "on prend les mêmes" ^^

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
29 mars 2007 à 12:59
oui mais je vois pas le changement

J'ai ca :

A *elt;
SafeArrayAccessData(*List,(void**)&elt);

Mais quand j'essaye d'afficher ou de remplir elt[i].tableau[j] ca ne marche pas ! Ca me met une erreur quand je le remplis et ca retourne des chiffres faux quand je l'affiche. Comment accéder proprement a tableau[j] de l'element i du tableau de structure A.

avec struct A
{
SAFEARRAY** tableau;
};

et type A
   tableau() as long
end type
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2007 à 14:47
tu n'aura JAMAIS a utiliser elt[i].tableau[j] ...

je te l'ai dit, "on prend les mêmes et on recommence" :

tableau n'est pas le premier element de ton tableau... c'est un SafeArray (les tableaux de VB)
tu dois donc acquerir le pointeur vers les données, et jouer avec....

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
29 mars 2007 à 15:08
et comment acquérir le pointeur vers les données et comment l'utiliser ? que dois mettre derrière elt[i] pour accéder aux élements du tableau de elt[i] ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2007 à 15:33
reprenons...

nous avons un tableau de structure

A *elt;
SafeArrayAccessData(*List,(void**)&elt);
ici, elt nous permet de manipuler les elements de notre tableau.

elt[i] est valable, puisque elt est un pointeur de struct A

la struct A contient un long nommé aa, ainsi qu'un pointeur vers un SafeArray de long, nommé tableau :

struct A
{
    long aa;
    SAFEARRAY** tableau;
}
on accède simplement a ces deux infos :

elt[i].aa  et elt[i].tableau

attention, tableau n'est pas un tableau de Long....

elt[i].tableau[j] est donc invalide...

pour manipuler les données de tableau, il faut de même acquérir un pointeur vers les données :

long* SousTableau;
SafeArrayAccessData(*(elt[i].tableau),(void**)&SousTableau);

ensuite, on peux manipuler les long du soustableau en faisant simplement
SousTableau[j]

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
29 mars 2007 à 16:06
SafeArrayAccessData(*(elt[i].tableau),(void**)&SousTableau);

j'effectue cette operation dans une boucle sur i et avant la fin de la boucle je rajoute SafeArrayUnaccessData(*(elt[i].tableau)), mais le programme plante.
0
vba_blitz Messages postés 32 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 26 juin 2007
2 avril 2007 à 14:38
Bonjour,

comment redimensionner tableau ? En effet lorsque je passe la structure A en paramètre, le tableau n'est pas initialisé.

Merci
0
Rejoignez-nous