这部分
*(Individual*)a->fitness
出现错误了。你试图使用->
访问fitness
,但同时你又使用*
解引用指针。你不能两者都做!
这里有两个解决方案。
方案A:使用*
解引用并使用.
访问fitness
。
(*(Individual*)a).fitness
解决方案B:使用
->
访问
fitness
。
((Individual*)a)->fitness
两种解决方案都需要将 void*
转换为 Individual*
。
变量 b
同样适用。
如果您是 C 语言的初学者,我建议您避免使用多个操作发生在一个紧凑语句中的情况。相反,将紧凑语句拆分成若干个单独的语句,这将使代码更易于理解和调试。例如:
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;
}
您不需要担心性能问题。编译器会将代码优化,使其与单个语句的代码一样高效。
话虽如此——正如@chqrlie所指出的那样——请注意比较代码是错误的!
该函数返回一个整数,但fitnessA-fitnessB
是一个将被转换为整数的double类型。因此,0.1-0.0
最终将返回0
,这不是您想要的结果。
您可以查看@chqrlie在https://dev59.com/v7Dla4cB1Zd3GeqP2Aod#53466034中的答案以获取更多详细信息。
代码也可以更改如下:
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;
}