gpt4 book ai didi

c - bsearch 的不同比较函数

转载 作者:行者123 更新时间:2023-12-04 08:07:58 25 4
gpt4 key购买 nike

要么 cmp func 似乎工作;无法理解在 qsort_cmp 的情况下如何解析 int* 类型的 arg1。
据我所知:int* 被传递给 qsort_cmp,在那里它被更改为 void*,然后在 return 语句中转换为 struct s*。到目前为止没问题,但是转换对象应该有一个名为 b 的成员,它的转换类型有但它的实例没有......

struct s { int a, b; };

int qsort_cmp(const void *r1, const void *r2) {
return ((struct s*) r1)->b - ((struct s*) r2)->b;
}

int bsearch_cmp(const void *key, const void *r2) {
return *(int*) key - ((struct s*) r2)->b;
}

/* themap is already qsorted */
int k = 'w'//hatever;
void *ret = bsearch(&k, themap, thenumber_ofelements, sizeof(one_element), qsort_cmp);

最佳答案

这些比较函数不可互换:比较b两个参数的字段,另一个比较 int第一个参数和 b 直接指向第二个参数指向的结构的字段。如果 a,它们将是等效的使用字段代替 b ,作为 a字段位于结构的开头。
这是规范:

7.22.5.1 The bsearch function

[...]

The comparison function pointed to by compar is called with two arguments that point to the key object and to an array element, in that order. The function shall return an integer less than, equal to, or greater than zero if the key object is considered, respectively, to be less than, to match, or to be greater than the array element.


因此第一个参数可以是指向 int 的指针。而第二个是指向结构数组的指针,只要比较函数与 bsearch一致即可调用方案
相反, qsort中使用的比较函数使用 2 个指向数组元素的指针调用,因此它们都是指向 s 的指针。结构。
但请注意,减去 2 int values 不是产生比较结果的可靠方法,因为此减法可能会导致许多值溢出: INT_MIN - 1例如。更好的方法是这样的:
struct s { int a, b; };

int qsort_cmp(const void *r1, const void *r2) {
const struct s *s1 = r1;
const struct s *s2 = r2;
return (s2->b < s1->b) - (s1->b < s2->b);
}

int bsearch_cmp(const void *key, const void *r2) {
const int *ip = key;
const struct s *s2 = r2;
return (s2->b < *ip) - (*ip < s2->b);
}
现代编译器为此生成无分支代码: https://godbolt.org/z/sW3dn6

关于c - bsearch 的不同比较函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66129300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com