如何将变量传递给函数?

时间:2014-04-10 17:45:33

标签: c

我使用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可用?

谢谢!

2 个答案:

答案 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;便携性。

否则,您必须使用全局或线程本地存储,或编写自己的排序功能。