Эта часть
*(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
- это двойное число, которое будет преобразовано в целое число.Так что 0.1 - 0.0
в конечном итоге вернет 0
- это не то, что вам нужно.
Вы можете увидеть этот ответ 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;
}