排序结构时Swenson的Timsort实现的问题

时间:2012-06-12 17:33:44

标签: c visual-studio-2010 macros c99 timsort

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

我遇到了两个问题:

1)要使用它,我需要定义适合我想要排序的类型的SORT_CMP宏。 我的类型被定义为(这里有点简化):

typedef struct{
    int a;
    int b;
} MyType

我尝试定义:

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

但我一直收到错误:“请求成员'a'在非结构或联合的东西中” 我想也许x和y可能是指针但是:

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

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

2)有没有办法在Visual Studio中编译该代码?它使用较新的C标准中的东西(如块中间的声明),cl.exe不接受它。我使用GCC(mingw)编译它,但mingw对于我的其余代码比VC慢20%(使用O2或O3标志与使用/ Ox的lc.exe)因此使用Timsort而不是stdlib qsort可以获得任何收益不会弥补这一点。 Pelles编译器也是如此。 我的大部分数据都有很多部分排序的序列,排序占用了大约50%的执行时间,因此我觉得假设我在VC中使用它会有好处。

1 个答案:

答案 0 :(得分:2)

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

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

很可能宏用于指向SORT_TYPE变量的解引用指针:

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

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

(*pMyTypeVar1.a - *pMyTypeVar2.a)

由于点运算符绑定比星型运算符更紧密,编译器会尝试找到指针apMyTypeVar1的成员pMyTypeVar2,这将无效。

使用建议的括号将导致:

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

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