将值传递给函数而不被列为正式参数?

时间:2014-04-10 09:40:33

标签: c

在stdlib.h中,

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

是否可以将以下函数传递为compar

int compareMyType (const void * a, const void * b, float c)
{
  float tmp = f((MyType*)a,  (MyType*)b, c );  // f is some function
  if (tmp < 0) return -1;
  if (tmp == 0) return 0;
  if (tmp > 0) return 1;
}

如果不是,如果不将c声明为全局变量,是否有某种方法?谢谢!

3 个答案:

答案 0 :(得分:3)

创建一个与qsort兼容的代理函数,并在其正文中调用您的函数:

int myCompare(const void *a, const void *b) {
    float c = ...;

    return compareMyType(a, b, c);
}

...

qsort(..., myCompare);

答案 1 :(得分:0)

  

是否可以将以下函数作为比较

传递

没有。指向仅具有完全相同签名的功能的指针是兼容的。您的compar函数必须具有签名

int compar(const void *, const void *);

您可以使用自定义compar函数原型编写自己的qsort函数,或者您可以在上述签名的函数中封装不同签名的比较函数,只需调用您的比较函数。

答案 2 :(得分:0)

不,功能签名不匹配。 compareMyType(const void * a,const void * b,float c)和int( compar)(const void ,const void *)

您可以在结构中打包变量c,并将结构指针强制转换为void指针并传递它。这是首先使用void指针的主要优点。