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)
我想比较结构中的适应度值.
这部分
*(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)
归档时间: |
|
查看次数: |
143 次 |
最近记录: |