#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);
数组很小,有大数字u32,但我只根据结构边缘的字段查找一个元素,即v1,然后只在v1之间进行比较。
bsearch使用的键是struct edge * l,其中l-> v1包含要搜索的元素。
结构边的数组,有要查找的元素v1,但是bserach找不到它并返回NULL,我没有看到我提交的错误
注意:该数组只包含10个要测试的元素,但它可以是一个包含25056012个元素的非常大的数组,甚至更多
答案 0 :(得分:1)
quantity_sold
永远不会返回0(匹配)。试试return x > y ? 1 : -1;
(只需注意未签名的类型,所以需要注意这一点 - 我使用了简单的演员,但可能有更安全的方式)
评论re:溢出是正确的(但在正常使用情况下不太可能),如果on是一个巨大的积极而另一个是巨大的负面,那么你将会遇到问题。
一种很好的清晰方法来处理任何大小而没有溢出或签名问题:
return (int)(x - y);
答案 1 :(得分:0)
感谢您的回答,他们帮助我找到了解决方案。 我仍然没有探测大型阵列。 无论如何,比较功能是:
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;
}
}