Давайте возьмем в качестве примера функцию обратного вызова сравнения qsort ()
int (*compar)(const void *, const void *)
Что происходит, когда результат функции сравнения зависит от текущего значения переменной?Похоже, что у меня есть только два варианта: использовать глобальную переменную (yuck) или обернуть каждый элемент несортированного массива в структуру, содержащую дополнительную информацию (double yuck).
Поскольку qsort () является стандартной функцией, я весьма удивлен, что она не позволяет передавать дополнительную информацию;что-то вроде аргумента execv()
в конце char *const argv[]
.1011 *, будучи двумя другими, у меня была эта проблема.
Я просто "делаю это неправильно" или это обычная проблема, и я приписал недосмотр этим типам определений функций обратного вызова?
РЕДАКТИРОВАТЬ
Я видел несколько ответов, в которых говорится о создании нескольких функций обратного вызова и определении того, какой из них подходит для передачи qsort()
.Я понимаю этот метод в теории, но как бы вы применили его на практике, если бы, скажем, я хотел, чтобы функция обратного вызова сравнения сортировала массив целых чисел в зависимости от того, насколько близок элемент к переменной 'x' ?.Может показаться, что мне понадобится одна функция обратного вызова для каждого возможного значения «x», которое не является начальным.
Вот рабочий пример использования глобальной переменной «x».Как бы вы предложили мне сделать это с помощью нескольких функций обратного вызова?
#include <stdint.h>
#include <stdio.h>
#include <math.h>
int bin_cmp(const void*, const void*);
int x;
int main(void)
{
int i;
int bins[6] = { 140, 100, 180, 80, 240, 120 };
x = 150;
qsort(bins, 6, sizeof(int), bin_cmp);
for(i=0; i < 6; i++)
printf("%d ", bins[i]);
return 0;
}
int bin_cmp(const void* a, const void* b)
{
int a_delta = abs(*(int*)a - x);
int b_delta = abs(*(int*)b - x);
if ( a_delta == b_delta )
return 0;
return a_delta < b_delta ? -1 : 1;
}
Вывод
140 180 120 100 80 240