【发布时间】:2016-09-24 18:59:23
【问题描述】:
我的比较函数可以在 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;
我在函数比较中尝试了许多“强制转换”变体,但都失败了。我的问题很明显,如何将 const void* 强制转换为我的结构元素?我知道这似乎是一个非常基本的问题,但我在任何地方都找不到明确的答案,我也是新手。任何帮助都将不胜感激。
【问题讨论】:
-
a = *(interval*)p;可能就是你的意思。 -
您不能转换为
struct类型或从struct类型转换。您可以将void*转换为指针类型或从指针类型转换。 (事实上,转换可以隐式完成,无需强制转换。) -
你到底为什么要这样做?丢弃参数中的所有类型信息,然后将数据视为特定类型是一种可怕的做法。如果有人用指向不同类型的指针调用它(没有什么能阻止任何人这样做!)这将导致各种问题。为什么不直接采用实际结构类型的 const ref 参数?
-
@adam10603 linux.die.net/man/3/qsort
-
@chux 这似乎是考虑重叠间隔相等的间隔排序。这是一个无效的排序比较器,因为您可以有
compar(a, b) == 0 && compare(b, c) == 0但compar(a, c) == -1的间隔。
标签: c struct void-pointers qsort