bsearch renvoie NULL mais l’élément est dans le tableau

#define u32 uint32_t #define Narray 10 struct edge { u32 v1; u32 v2; }; int struct_cmp_by_v1(const void *i, const void *j) { struct edge *a = (struct edge *)i; struct edge *b = (struct edge *)j; u32 x = a->v1; u32 y = b->v1; return x > y ? 1 : -1; } struct edge *array = malloc((sizeof(struct edge))*Narray); struct edge *l = malloc(sizeof(struct edge)); struct edge *e = (struct edge *) bsearch(l, array, Narray, sizeof(struct edge), struct_cmp_by_v1); 

Le tableau est petit avec de grands nombres u32 mais je ne cherche qu’un élément en fonction d’un champ de la, struct edge, c’est-à-dire v1, la comparaison n’est faite qu’entre v1.

La clé utilisée par bsearch est, struct edge * l, où l-> v1 contient l’élément à rechercher.

Le tableau de bord de la structure a l’élément v1 à trouver mais bserach ne le trouve pas et renvoie NULL, je ne vois pas l’erreur que je commets

Remarque: le tableau ne contient que 10 éléments à tester, mais il peut s’agir d’un très grand tableau avec 25056012 éléments, voire davantage.

return x > y ? 1 : -1; Ne retourne jamais 0 (une correspondance). Essayez de return (int)(x - y); (Je viens de noter les types non signés, il faut donc en être conscient – j’ai utilisé une dissortingbution simple, mais il existe probablement un moyen plus sûr)

Le commentaire re: le débordement est correct (mais peu probable en utilisation normale), si on est un énorme positif et que l’autre est un énorme négatif, vous allez avoir des problèmes.

Une façon claire et agréable de gérer toutes les tailles sans débordement ni problèmes de signalisation:

 if (x == y) return 0; return x > y ? 1 : -1; 

Merci pour les réponses, ils m’ont aidé à trouver la solution. Je ne cherche toujours pas un grand tableau. Quoi qu’il en soit, la fonction de comparaison est:

 int struct_cmp_by_v2(const void *i, const void *j) { struct edge *a = (struct edge *)i; struct edge *b = (struct edge *)j; u32 x = a->v1; u32 y = b->v1; if (x == y) return 0; else { if (x > y) return 1; else return -1; } }