我在qsort()中使用我的比较函数,如下所示:
int compar(const void *p, const void *q){
interval a,b;
*p = (interval)a
*q = (interval)b;
if(a.extrem[1] < b.extrem[0])
return -1;
if(b.extrem[1] < a.extrem[0] )
return 1;
return 0;
}
我的结构如下:
typedef struct interval{
double extrem[2];
} interval;
我在功能比较中尝试了许多“cast”变体,但都失败了。我的问题,很明显,我如何将const void *转换为我的struct元素?我知道这似乎是一个非常基本的问题,但我无法在任何地方找到明确的答案,我也是新手。任何帮助都很高兴。
答案 0 :(得分:3)
你很亲密......
typedef struct interval {
double extrem[2];
} interval;
int compar(const void *p, const void *q) {
const interval *a = p, *b = q;
if(a->extrem[1] < b->extrem[0])
return -1;
if(b->extrem[1] < a->extrem[0])
return 1;
return 0;
}
顺便说一下,如果没有一次演员,这将在gcc -Wall.
更新... Tavian提出了一个很好的观点,这不是传递性排序,因此您的设置在技术上具有no partial order.但是根据您的数据和目标,即使如此,qsort也可能返回有用的结果。
答案 1 :(得分:1)
qsort()
函数将使用指向元素的指针调用回调函数。
假设数组是interval
的实际数组,而不是区间指针中的一个,你可以这样做:
static int interval_compare(const void *a, const void *b)
{
const interval *ia = a, *ib = b;
if(ia->extrem[1] < ib->extrem[0]) return -1;
return ib->extrem[1] > ia->extrem[0];
}
我不了解extrem
索引,但这是您使用的内容。将void *
转换为更具体的类型时,不需要强制转换。请参阅this answer。