当一个参数不变时更改 C 中函数指针的签名

标签 c pointers function-pointers quicksort

我想在 C 中使用快速排序,其函数签名为 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)),但我的比较函数的签名是 int (*compar)(const void *, const void*, const int),其中第三个参数在一次调用快速排序期间是常量。

作为说明,假设我想根据不同的范数(例如 L0、L1、L2 和 Linifinity 范数)对 vector 数组进行排序。它实际上是哪个范数,作为第三个参数传递给比较函数,但在调用 qsort 期间保持不变。是否可以以类似的形式进行作业

//Function declaration for parametric comparison
int cmp3(int* a_vec, int* b_vec, int x);

// Somewhere in main
int (*cmp2)(int, int);
cmp2 = cmp3(int*, int*, 2);//2 could mean L2 norm

能够调用类似的东西

qsort(a, 100, sizeof(a), cmp2);

我知道这行不通,但我希望它能让我知道我想要完成什么。而且也不可能进行不同的比较函数并调用 qsort,因为不同比较方式的数量太大。

最佳答案

这称为partial function application ,并且只能使用 C: 中的包装器来实现类似的效果:

int cmp3(int *a, int *b) {
    return cmp2(a, b, 2);
} 

如果您喜欢部分函数应用程序或者映射或纯函数,您可能需要研究函数式编程语言,例如 Haskell。

关于当一个参数不变时更改 C 中函数指针的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817243/

相关文章:

c - 交叉编译时添加-O2选项导致展开回溯失败

对指针和结构感到困惑

c - 将文件读入 char 数组,然后 malloc 大小。 (C)

c - 以下两个函数是否等价?如果不是,为什么不呢?

c - 指向数组第一个元素的常量指针如何工作?

closures - 在闭包 Rust 中使用函数指针参数

c++ - 返回一个 void* 数组

检查输入的值是否包含数字

c - C 中函数指针语法的用途是什么?

c - 最佳性能加法模 2^32 实现