Structure VB et C++

fzpitt Messages postés 3 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 5 juillet 2004 - 25 juin 2004 à 16:36
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 29 juin 2004 à 18:13
Bonjour,

j'ai développé une Dll en C qui récupère des valeurs d'un fichier pour alimenter, entre autre, une structure est définie comme suit :

typedef struct{
BYTE NbDepassement;
TYPE_Depassement Depass[C_UslmNbMaxDepassement];
} TYPE_Uslm;

où le membre Depass est également défini en structure :

typedef struct{
int DateDebut;
BYTE Moteur;
BYTE CodeDepassement;
double Durees;
double DureePerRange[C_UslmNbDurees];
int Tot;
float Nf;
float Dng;
float Ng;
int DateMax;
float Oat;
float Po;
} TYPE_Depassement;

Dans mon application VB, utilisant cette Dll C, j'ai les définitions suivantes :

Type TYPE_USLM
byt_NbDepassement As Byte
Depass(0 To CMax - 1) As TYPE_Depassement
End Type

où le membre Depass est également défini en structure :

Type TYPE_Depassement
lng_DateDebut As Long
byt_Moteur As Byte
byt_CodeDepassement As Byte
lng_Duree As Double
a_lng_Range(0 To C_UslmNbDureesEC145 - 1) As Double
lng_Tot As Long
sng_Nf As Single
sng_Dng As Single
sng_Ng As Single
lng_DateMax As Long
sng_Oat As Single
sng_Po As Single
End Type

Tout ceci fonctionne très bien, excepté lorsque pour ln_Duree j'ai des valeurs très grande du style 4291456230. La valeur récupéré dans la Dll est correcte, mais lors du passage à VB, il y a un problème de cohérence de valeur. Celle-ci ne correspond pas à celle lue par la Dll et pose un problème d'affichage (valeur du style 2,4646464546546e-308 !!!!).

Quelqu'un a-t-il une solution a me proposer ?

D'avance merci à tous.

Franck.

3 réponses

Scalpweb Messages postés 1467 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 5 mai 2010 4
25 juin 2004 à 18:22
Es-tu sur que Double est bien le type que tu dois utiliser ? Pourquoi pas Single ?

Pice-WCorp bientôt sur le net.
0
fzpitt Messages postés 3 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 5 juillet 2004
28 juin 2004 à 09:47
Merci de ta proposition, mais avec 'Single' le problème empire puisqu'il ne peut contenir de nombre aussi grand que 'Double'.
Par ailleurs, lorsque j'affiche directement, sous VB, la valeur 'lng_Duree' de la structure 'TYPE_Depassement', le problème ne se pose pas. Il n'y a problème qu'à partir du moment où cette valeur est affichée en tant que membre de structure, elle-même membre de structure, sous VB !!!
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 25
29 juin 2004 à 18:13
salut

je mettrais effectivement ca :

public type TYPE_Uslm
NbDepassement as Byte
Depass(C_UslmNbMaxDepassement-1) as TYPE_Depassement
end type

public type TYPE_Depassement
DateDebut as long
Moteur as byte
CodeDepassement as byte
Durees as double
DureePerRange(C_UslmNbDurees-1) as double
Tot as long
Nf as single
Dng as single
Ng as single
DateMax as long
Oat as single
Po as single
end type

MAIS et il y a un MAIS : il faudrait peut etre mettre un
#pragma pack(4) pour aligner les structure comme VB sur un DWORD ou pack(8) pour etre sur un 8bytes-alignment...

je ne suis pas vraiment sur mais je pense que le defaut pack(1) ne doit pas marcher

voilà

ShareVB
0