与 qsort 一起使用的转换函数

标签 c

我正在开发一个对 vector 进行操作的简单库。 它定义了一种经常使用的函数类型:

typedef float (*vec_pair_fun) (float x, float y);

出于易用性的原因,我想创建一个使用 vec_pair_fun 来比较 vector 的每个元素的排序函数。 目前,我正在这样做:

static vec_pair_fun sort_function;

// follow improvements suggested by @chux below
static int converted_sort_function(const void* a, const void* b){
    //old code: return (int) qsort_function(*(float*)a,*(float*)b);
    float f = sort_function(*(float*)a,*(float*)b);
    return (f > 0.0f) - (f < 0.0f);
}

void vecx_sort(int x, float v[], vec_pair_fun func){
    sort_function=func;
    qsort(v,x,sizeof(float),converted_sort_function);
}

但我不太喜欢这种解决方法,因为它不是线程安全的,因为 sort_function 可以被另一个线程更改。

关于如何改进这个有什么想法吗?

<小时/>

编辑: 一种方法是自己对数组进行排序。 重新编码 qsort 确实不是我计划做的,所以我真的很愿意接受建议

最佳答案

问:关于如何改进这个问题有什么想法吗?
答:不要将 float 结果转换为 int 进行比较。

也许不是OP主要关心的问题,但(int) sort_function(*(float*)a,*(float*)b);很弱。
FP 点结果可能是 -0.40.4,这两者都会转换为 (int) 0
FP 点结果可能为 > INT_MAX,转换为 int 为 UB。
建议:

static int converted_sort_function(const void* a, const void* b){
    float f = sort_function(*(float*)a,*(float*)b);
    return (f > 0.0f) - (f < 0.0f);
}

对于线程安全问题,请考虑传入上下文指针的qsort_s()qsort_s() 在 C11 附录 K 中指定,因此您的编译器中可能不存在。

errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size,
    int (*compar)(const void *x, const void *y, void *context), 
    void *context);

关于与 qsort 一起使用的转换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27081971/

相关文章:

c - 获取进程的 pid,了解其使用的 Linux header 中的结构

c - TCP 数据报如何到达客户端计算机?

c - 动态函数名称 - 无法解析外部符号

c - 为什么声明一个长度为 INT_MAX 的 int 数组会产生段错误?

使用 memcpy 从缓冲区的第二个元素复制到其他缓冲区

c - 如何在不使用 strcpy 函数的情况下将所有字符(包括 '\0' )从一个数组复制到另一个数组?

c - 在 C 中向字符串添加零

使用静态文件编译 C 程序

c - 带符号的 NaN 值

c++ - CryptGenRandom 在循环调用时给出相同的值