gpt4 book ai didi

转换函数指针

转载 作者:太空狗 更新时间:2023-10-29 16:33:48 24 4
gpt4 key购买 nike

我正在编写一个函数,它接收一个指向比较函数的指针和一个 MyStructs 数组,并且应该根据比较函数对数组进行排序:

void myStructSort(
struct MyStruct *arr,
int size,
int (*comp)(const struct MyStruct *, const struct MyStruct *)) {
qsort(arr, size, sizeof(struct MyStruct), comp);
}

不幸的是,这不会编译,因为 qsort 期望比较器接收 void * 参数而不是 const struct MyStruct *。我想到了几个不好的解决方案,想知道正确的解决方案是什么。

选项 1

comp 转换为 int (*)(const void *, const void*)。这编译但未定义的行为(见 this SO question )。

选项 2

创建一个全局变量int (*global_comp)(const struct MyStruct *, const struct MyStruct *)并在myStructSort中设置global_comp=comp >。然后创建一个函数:

int delegatingComp(const void *a, const void *b) {
return globalComp((const struct MyStruct *)a, (const struct MyStruct *)b);
}

然后在 myStructSort 中调用 qsort(arr, size, sizeof(struct MyStruct), delegatingComp)。这个问题是 icky 全局变量。

选项 3

重新实现qsort。这在功能上是安全的,但却是非常糟糕的做法。

有神奇的完美第四个选项吗?

编辑

我无法更改 myStructSort 的 API,我正在使用 gcc c99 -Wall -Wextra -Wvla 编译我的代码。

最佳答案

选项 2 破坏了线程安全,所以我不会选择那个。

正如您指出的那样,选项 3 完全错误。没有理由重新实现快速排序并可能犯错误。

选项 1 是 UB,但它适用于任何健全的编译器。如果您选择此选项,请务必添加评论。

我还会考虑:

选项 4. 重新设计 myStructSort 的接口(interface)以采用 int (*)(const void *, const void*) 或完全废弃它并调用 qsort 直接。基本上将它发回给架构师,因为他做出了糟糕的设计选择。

关于转换函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com