这部分
*(Individual*)a->fitness
是错的。您尝试访问fitness
using ->
但同时您使用取消引用指针*
。你不能两者兼得!
这里有两个解决方案。
解决方案 A:使用取消引用*
和访问fitness
using .
(*(Individual*)a).fitness
解决方案B:访问fitness
using ->
((Individual*)a)->fitness
这两种解决方案还需要来自void*
to 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
是一个将被转换为整数的双精度值。所以0.1 - 0.0
最终会回来0
- 这不是你想要的。
你可以看看这个答案https://stackoverflow.com/a/53466034/4386427 https://stackoverflow.com/a/53466034/4386427来自 @chqrlie 了解更多详细信息。
代码也可以更改为:
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;
}