将它作为参数发送到'qsort'时转换函数类型

时间:2014-12-07 00:07:21

标签: c sorting

typedef void* ListElement;
typedef int(*CompareListElements)(ListElement, ListElement);

ListResult listSort(List list, CompareListElements compareElement) {
    .
    .
    .
    qsort(arr, size, sizeof(*arr), compareElement);
    .
    .
    .
}

前两行是澄清什么是CompareListElements. 当我将compareElement作为参数发送到库函数时,qsort'我收到这些警告信息:

passing argument 4 of 'qsort' from incompatible pointer type [enabled by default]

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

重写比较器,使其与qsort()期望的匹配:

typedef int (*CompareListElements)(const void *, const void *);

在比较器内部,转换为正确的类型:

int compare_elements(const void *v1, const void *v2)
{
    const RealType *p1 = v1;
    const RealType *p2 = v2;
    …do comparison…
    return …;
}

这样,您根本不会转换函数指针。 RealType是隐藏在(选择不当)背后的类型:

typedef void *ListElement;

真实类型不是void;它可能是一些结构类型。请注意,使用void *作为列表元素类型几乎失去了C可用的所有类型安全性(可以说它开始时可能不够)。你可以做得更好:

typedef struct Element ListElement;

或类似的东西,并将指针传递给ListElement。 (另请参阅Is it a good idea to typedef pointers?。您可能还会发现How to sort an array of structs in C?有帮助,毫无疑问其他相关问题也会有所帮助。)。