我使用stdlib.h中的qsort,
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
以下列方式:
void myfun (float *arr, int n, float c) // value of c is changeable
{
...// some code
qsort(float *arr, n, sizeof(float), compareme);
...// some code
}
与
int compareme (const void * a, const void * b)
{
float tmp = f((float*)a, (float*)b, c ); // f is some function, and how can I pass c here?
if (tmp < 0) return -1;
if (tmp == 0) return 0;
if (tmp > 0) return 1;
}
如何在此c
中使compareme
可用?
谢谢!
答案 0 :(得分:4)
许多人使用(令人讨厌的)全局变量。
qsort()不包含仅传递给用户提供的compar()函数的额外void指针参数,这太糟糕了。我最终编写了自己的qsort()来克服这个限制。
原型:
int myQsort(
void *arrayBase,
size_t elements,
size_t elementSize,
int(*compar)(const void *, const void *, void *callerArg),
void *callerArg
);
这允许我将各种结构(强制转换为void *)传递给我的compar()fn。
答案 1 :(得分:4)
如果你碰巧使用Glibc(即Linux),你可以使用qsort_r
:
int compareme (const void *a, const void *b, void *data)
{
float c = *(float *)data;
float tmp = f((float*)a, (float*)b, c);
if (tmp < 0) return -1;
if (tmp == 0) return 0;
if (tmp > 0) return 1;
}
然后致电
qsort_r(float *arr, n, sizeof(float), compareme, &c);
您必须在之前定义预处理器宏_GNU_SOURCE
,包括任何标头才能获得此功能(例如使用-D_GNU_SOURCE
)来获取此功能,并且它将限制您的程序&# 39;便携性。
否则,您必须使用全局或线程本地存储,或编写自己的排序功能。