为qsort的结构编写比较函数?

Aki*_*ghe 2 c qsort genetic-algorithm

qsort在C中为函数编写比较函数时遇到了麻烦.这就是我目前所拥有的:

int cmpfunc(const void *a, const void *b) {
    return (*(Individual*)a->fitness - *(Individual*)b->fitness);
}
Run Code Online (Sandbox Code Playgroud)

我知道比较函数是如何工作的,但我不明白如何在我的结构中引用一个整数值Individual.这是个人的结构.

typedef struct {
    PPM_IMAGE image;
    double fitness;
} Individual;
Run Code Online (Sandbox Code Playgroud)

我想比较结构中的适应度值.

438*_*427 5

这部分

*(Individual*)a->fitness
Run Code Online (Sandbox Code Playgroud)

是错的.您尝试fitness使用->但同时取消引用指针*.你不能两个都做!

这是两个解决方案.

解决方案A:取消使用*和访问fitness使用.

(*(Individual*)a).fitness
Run Code Online (Sandbox Code Playgroud)

解决方案B:fitness使用访问->

((Individual*)a)->fitness
Run Code Online (Sandbox Code Playgroud)

这两种解决方案还需要从铸造void*Individual*.

同样适用于变量 b

如果您是C语言的初学者,我建议您避免在多个事情发生时使用紧凑语句.而是将compact语句拆分为多个单独的语句.这将使代码更容易理解和调试.喜欢:

int cmpfunc (const void * a, const void * b){
    Individual* pA = a;
    Individual* pB = b;
    double fitnessA = pA->fitness;
    double fitnessB = pB->fitness;
    return fitnessA - fitnessB;
}
Run Code Online (Sandbox Code Playgroud)

您无需担心性能问题.编译器将优化代码,使其与单个语句代码一样高效.

那说 - 正如@chqrlie所说 - 注意比较代码是错误的!

该函数返回一个整数,但是fitnessA - fitnessB是一个将转换为整数的double.所以0.1 - 0.0最终会回来0- 这不是你想要的.

您可以从@chqrlie 看到此答案/sf/answers/3742622411/以获取更多详细信息.

代码也可以像:

int cmpfunc (const void * a, const void * b){
    Individual* pA = a;
    Individual* pB = b;
    double fitnessA = pA->fitness;
    double fitnessB = pB->fitness;
    if (fitnessA > fitnessB) return 1;
    if (fitnessA < fitnessB) return -1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)