2014-04-10 364 views
6

我的qsort使用stdlib.h中,如何将变量传递给函数?

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; 
} 

我怎样才能让ccompareme可用在这里?

谢谢!

+0

你不能,因为[tag:C]不是词法范围。如果你可以切换到[tag:C++],你可以创建一个包含'c'的比较对象。 –

+0

谢谢,我只能用c – Tim

回答

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。

+2

如果你确定它是线程本地的,我认为全局变量可以很好。不可移植的qsort_r http://man7.org/linux/man-pages/man3/qsort.3.html – this

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)来获得这个功能,它会限制你的程序的可移植性。

否则,您将不得不使用全局或线程本地存储,或编写自己的排序函数。