Comparaison de 2 structures

cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008 - 30 nov. 2005 à 17:13
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008 - 2 déc. 2005 à 10:05
Bonjour,

Je voudrais comparer le contenu de 2 structures. En C, j'utilise le memcmp pour comparer mes structures. Y-a-t'il quelque chose d'équivalent en VB ?

Exemple :

Type udtIndividual

strFirstName as string * 20
strLastName as string * 20
blnMaleOrFemale as boolean
intAge as integer
bytID as byte

End Type

Public Individual As udtIndividual
Public EditIndividual as udtIndividual
Public blnNeedSetup as boolean

' Je remplis mes 2 structures
...

' Je veux comparer mes 2 structures si c'est différent alors je voudrais copier la structure EditIndividual dans Individual

' Code en C : si le résultat est = 0 alors pas de changement
blnNeedSetup = (memcmp (&Individual , &EditIndividual , sizeof Individual ) != 0);

if (blnNeedSetup = true) then

Individual = EditIndividual

end if

7 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
30 nov. 2005 à 17:26
Pas d'équivalent en VB6 !
Il faut que tu ajoute à ta classe une méthode() Compare() par exemple dans laquelle tu fais un test membre à membre

CR
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 nov. 2005 à 21:23
IcebergMan si tu fais du C tu sauras adpter en Declare VB:


SIZE_T RtlCompareMemory(IN CONST VOID *Source1, IN CONST VOID *Source2, IN SIZE_T Length);


Tu passes taille struct en dernier param.
Si (retour de RtlCompareMemory == taille struct) alors EST EGAL.
RtlCompareMemory est à prendre dans Ntdll.dll (pour Declare VB).

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
30 nov. 2005 à 21:53
Merci à vous deux pour ces informations. je vais essayer d'adapter la fonction SIZE_T RtlCompareMemory.

@+

Ice.
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
1 déc. 2005 à 10:54
BruNews,


J'ai essayé d'implémenter la fonction RtlCompareMemory, mais j'ai un problème. Si les structures sont identiques, j'ai toujours un retour différent de la longeur de la structure.

Peux tu m'aider ?

Ci-joint, un extrait de mon code :

' Déclaration

Public Declare Function CompareMemory Lib "Ntdll.dll " Alias "RtlCompareMemory" (Destination As Any, Source As Any, ByVal Length As Long) As Long

' Je remplis mes 2 structures
...

' Comparaison des 2 structures


Dim lngReturn as Long

lngReturn = CompareMemory(Individual , EditIndividual , LenB(Individual ))

If not (lngReturn = LenB(Individual)) then

Individual = EditIndividual

End If
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 déc. 2005 à 11:40
Désolé mais je te passe en C et tu traduiras, syntaxe VB et moi...
Tu peux aussi recompiler et vérifier que va impec.

#include <windows.h>


typedef struct _BNTYPE {
DWORD n;
char name[20];
} BNTYPE, *LPBNTYPE;


char szappname[] = "bnRTLCMP";


int __stdcall bnRtlCmp(void *pa, void *pb, DWORD len)
{
long (WINAPI *pRtlcmpmem)(PVOID, PVOID, ULONG);
HMODULE hdll;
hdll = GetModuleHandle("ntdll.dll");
*(FARPROC*)&pRtlcmpmem = GetProcAddress(hdll, "RtlCompareMemory");
return ((pRtlcmpmem(pa, pb, len) == len) ? 1: 0);
}



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
BNTYPE a, b;
memset(&a, 0, sizeof(BNTYPE));
memset(&b, 0, sizeof(BNTYPE));
MessageBox(0, bnRtlCmp(&a, &b, sizeof(BNTYPE)) ? "OUI": "NON", szappname, 0);
return 0;
}

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
2 déc. 2005 à 03:07
Private Type udtIndividual

strFirstName As String * 20

strLastName As String * 20

blnMaleOrFemale As Boolean

intAge As Integer

bytID As Byte

End Type



Private Declare Function CompareMemory Lib "Ntdll.dll " Alias
"RtlCompareMemory" (Destination As Any, Source As Any, ByVal Length As
Long) As Long



Private Sub Command1_Click()

Dim Individual As udtIndividual

Dim EditIndividual As udtIndividual

Dim lngReturn As Long

Dim Lg As Long



Individual.strFirstName = "A"

Individual.strLastName = "A"

Individual.blnMaleOrFemale = True

Individual.intAge = 1

Individual.bytID = 0



EditIndividual.strFirstName = "A"

EditIndividual.strLastName = "A"

EditIndividual.blnMaleOrFemale = True

EditIndividual.intAge = 1

EditIndividual.bytID = 0



' ce qui est passé dans la Fonction ce sont des copies

Lg = Len(Individual)

lngReturn = CompareMemory(Individual, EditIndividual, Lg)

MsgBox Lg

MsgBox lngReturn



' sinon il faut des pointeurs

Lg = LenB(Individual)

lngReturn = CompareMemory(ByVal VarPtr(Individual), ByVal VarPtr(EditIndividual), Lg)

MsgBox Lg

MsgBox lngReturn


Daniel
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
2 déc. 2005 à 10:05
Gobillot,


J'ai essayé ton code et ça fonctionne. Je pense que c'était juste la façon dont je calculais la longueur de la structure qui n'était pas bonne. (Cfr Len() et LenB()).


Merci à vous deux pour toutes ces informations.


@+

Ice.
0
Rejoignez-nous