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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
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
33
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