[英]How can I cast a const void* to a struct element?
我有我的比较函数在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元素? 我知道这似乎是一个非常基本的问题,但我无法在任何地方找到明确的答案,我也是新手。 任何帮助都很高兴。
你很亲密......
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.
下完全清晰gcc -Wall.
更新... Tavian提出了一个很好的观点,这不是一个传递性的排序,所以你的设置在技术上没有偏序。 但是,根据您的数据和目标,qsort可能会返回有用的结果。
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 *
转换为更具体的类型时,不需要强制转换。 看到这个答案 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.