Comment comparer deux instances de structs pour l'égalité en C standard ?
Réponses
Trop de publicités?Cela dépend si la question que vous posez est :
- Ces deux structs sont-ils le même objet ?
- Ont-ils la même valeur ?
Pour savoir s'il s'agit du même objet, il faut comparer les pointeurs des deux structs pour vérifier leur égalité. Si vous voulez savoir en général s'ils ont la même valeur, vous devez effectuer une comparaison approfondie. Cela implique la comparaison de tous les membres. Si les membres sont des pointeurs vers d'autres structs, vous devez également effectuer une récursion dans ces structs.
Dans le cas particulier où les structs ne contiennent pas de pointeurs, vous pouvez faire un memcmp pour effectuer une comparaison par bit des données contenues dans chacun d'eux sans avoir à savoir ce que les données signifient.
Assurez-vous de savoir ce que signifie "égal" pour chaque membre - c'est évident pour les ints mais plus subtil lorsqu'il s'agit de valeurs à virgule flottante ou de types définis par l'utilisateur.
Si les structs ne contiennent que des primitives ou si vous êtes intéressé par une égalité stricte, vous pouvez faire quelque chose comme ceci :
int my\_struct\_cmp(const struct my\_struct \* lhs, const struct my\_struct \* rhs)
{
return memcmp(lhs, rsh, sizeof(struct my\_struct));
}
Cependant, si vos structs contiennent des pointeurs vers d'autres structs ou unions, vous devrez écrire une fonction qui compare correctement les primitives et effectue des appels de comparaison contre les autres structures, le cas échéant.
Sachez toutefois que vous auriez dû utiliser memset(&a, sizeof(struct my_struct), 1) pour remettre à zéro la plage de mémoire des structures dans le cadre de l'initialisation de votre ADT.