gpt4 book ai didi

c - 对结构进行排序时 Swenson 的 Timsort 实现存在问题

转载 作者:行者123 更新时间:2023-11-30 14:24:53 31 4
gpt4 key购买 nike

我找到了 Timsort 的 Swenson C 实现: https://github.com/swenson/sort在一个较旧的 SO 问题中提到过。

我遇到两个问题:

1)要使用它,我需要定义适合我要排序的类型的 SORT_CMP 宏。我的类型定义为(此处稍作简化):

typedef struct{
int a;
int b;
} MyType

我尝试定义:

#define SORT_TYPE MyType
#define SORT_CMP(x,y) (x.a - y.a)

但我不断收到错误:“请求非结构或 union 中的成员‘a’”我认为 x 和 y 可能是指针,但是:

#define SORT_CMP(x,y) (x->a - y->a)

也不起作用。你能帮我吗?我是 C 新手,可能缺少一些基本的东西。

2)有什么方法可以在 Visual Studio 中编译该代码吗?它使用较新的 C 标准中的内容(例如 block 中间的声明),并且 cl.exe 不接受它。我使用 GCC (mingw) 编译它,但 mingw 的其余代码比 VC 慢 20%(使用 O2 或 O3 标志 vs lc.exe 使用/Ox),所以我可以从使用 Timsort 而不是 stdlib qsort 中获得任何 yield 无法弥补这一点。 Pelles 编译器也是如此。我的大部分数据都有很多部分排序的序列,排序大约需要 50% 的执行时间,所以我觉得假设我让它在 VC 中工作,这里会有收获。

最佳答案

您可以尝试在宏参数周​​围添加括号,如下所示:

#define SORT_CMP(x,y) ((x).a - (y).a)

该宏很可能与指向 SORT_TYPE 变量的取消引用指针一起使用:

SORT_TYPE * pMyTypeVar1, pMyTypeVar2;
...
SORT_CMP(*pMyTypeVar, *pMyTypeVar2);

如果宏参数周围的括号丢失,预处理器会生成如下内容:

(*pMyTypeVar1.a - *pMyTypeVar2.a)

由于点运算符比星运算符绑定(bind)得更紧,编译器会尝试为指针 pMyTypeVar1pMyTypeVar2 查找成员 a > 这是行不通的。

按照建议使用括号会导致:

((*pMyTypeVar1).a - (*pMyTypeVar2).a)

这样,编译器首先取消引用 pMyTypeVar1pMyTypeVar2,最后能够找到成员 a

关于c - 对结构进行排序时 Swenson 的 Timsort 实现存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11001823/

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