如何将const void *转换为struct元素?

时间:2016-05-26 16:33:58

标签: c struct void-pointers qsort

我在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元素?我知道这似乎是一个非常基本的问题,但我无法在任何地方找到明确的答案,我也是新手。任何帮助都很高兴。

2 个答案:

答案 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