Эта часть
*(Individual*)a->fitness
неправильно. Вы пытаетесь получить доступ к fitness
с помощью ->
, но в то же время разыменовываете указатель с помощью *
. Вы не можете сделать оба!
Вот два решения.
Решение А. Разыменование с помощью *
и доступ к fitness
с помощью .
(*(Individual*)a).fitness
Решение Б. Получите доступ к 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;
}
person
4386427
schedule
25.11.2018