【发布时间】:2012-10-02 07:15:29
【问题描述】:
我正在学习 LCTHW 教程,我有一个任务要做。 这是数据结构:
typedef struct DArray {
int end;
int max;
size_t element_size;
size_t expand_rate;
void **contents;
} DArray;
我已经声明了一个 typedef:
typedef int (*DArray_compare) (const void *a, const void *b);
当我创建一个排序函数时,我将一个 DArray_compare 传递给它,问题是我无法弄清楚如何做这个比较器的示例。
我试图做这样的事情:
int compare(const void *a, const void *b)
{
int i = (int)*a;
int k = (int)*b;
printf("%d %d\n", i, k);
return i - k;
}
但我得到一个错误:
error: operand of type 'void' where arithmetic or pointer type is required int i = (int)*a;
问题是:在不改变比较器的struct和typedef的情况下,我想创建一个比较int的比较器,我该怎么做呢?
【问题讨论】:
-
您需要稍微澄清一下上下文。比较器函数的参数到底是什么?它是数组中两个
DArray结构的地址,还是指向数组中两个结构的两个int元素的指针?或者是其他东西?大多数答案都假设您正在传递两个指向整数的指针,因为这就是您的问题似乎表明正在发生的事情,但是通用排序函数将使用指向结构的指针。请注意,您的减法存在签名int溢出的风险,这会导致未定义的行为。 -
比较器函数的参数是数组元素的指针。
-
那么你的参数
a和b实际上是DArray指针,但你可以将它们视为指向第一个元素(end)的指针,使用各种符号,例如接受回答。
标签: c pointers compare function-pointers void-pointers