Проблема состоит из двух частей: как написать код и как сравнить типы пакетов. Вы должны убедиться, что вы всегда возвращаете значение. Ваш код также всегда должен быть таким, чтобы:
porownaj(&pkt_a, &pkt_b) == -porownaj(&pkt_b, &pkt_a)
Ваше сравнение контуров не обрабатывает такие случаи, как:
pkt_a->alfa > pkt_b->alfa && pkt_a->r_kw <= pkt_b->r_kw
pkt_a->alfa < pkt_b->alfa && pkt_a->r_kw >= pkt_b->r_kw
pkt_a->alfa == pkt_b->alfa && pkt_a->r_kw != pkt_b->r_kw
Есть еще одна проблема - уместно ли сравнивать значения с плавающей запятой для точного равенства? Это будет зависеть от вашей заявки.
Механически, вы должны преобразовать указатели const void в указатели const структуры. Я использую явное приведение - это требуется в C ++, и я стараюсь сделать свой код приемлемым для компилятора C ++, даже если это действительно код на C.
int porownaj(const void *vp1, const void *vp2)
{
const pkt *pkt_a = (const pkt *)vp1;
const pkt *pkt_b = (const pkt *)vp2;
if (pkt_a->alfa > pkt_b->alfa && pkt_a->r_kw > pkt_b->r_kw) return 1;
if (pkt_a->alfa == pkt_b->alfa && pkt_a->r_kw == pkt_b->r_kw) return 0;
if (pkt_a->alfa < pkt_b->alfa && pkt_a->r_kw < pkt_b->r_kw) return -1;
return 0;
}
Это не относится к битам, которые я не могу разрешить, так как я не являюсь участником необходимой информации. Обратите внимание, что в общем случае многомерные объекты (такие как комплексные числа или координаты (x, y) или (x, y, z)) не могут просто сравниваться для значений больше или меньше или равных.