C 斯文森的问题';排序结构时的TIMS排序实现

C 斯文森的问题';排序结构时的TIMS排序实现,c,visual-studio-2010,macros,c99,timsort,C,Visual Studio 2010,Macros,C99,Timsort,我发现了Swenson的Timsort的C实现: 在一个较老的SO问题中提到 我遇到了两个问题: 1) 要使用它,我需要定义适合我要排序的类型的SORT_CMP宏。 我的类型定义为(这里有点简化): 我试图定义: #define SORT_TYPE MyType #define SORT_CMP(x,y) (x.a - y.a) 但我不断地遇到一个错误:“请求在非结构或联盟中的成员‘a’” 我以为x和y可能是指针,但: #define SORT_CMP(x,y) (x->a - y-&g

我发现了Swenson的Timsort的C实现: 在一个较老的SO问题中提到

我遇到了两个问题:

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

我试图定义:

#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) 有没有办法在VisualStudio中编译这些代码?它使用从较新的C标准(如块中间的声明)和C.exe不接受的东西。我使用GCC(mingw)编译了它,但是mingw在我代码的其余部分要比VC慢20%(使用O2或O3标志与使用/Ox的lc.exe相比),所以我从使用Timsort而不是stdlib qsort中获得的任何收益都无法弥补这一点。佩尔斯编译器也是如此。
我的大多数数据都有很多部分排序的序列,排序占用了大约50%的执行时间,因此我觉得如果我在VC中工作,这里会有所收获。

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

#define SORT_CMP(x,y) ((x).a - (y).a)
宏很可能与指向SORT_类型变量的解引用指针一起使用:

SORT_TYPE * pMyTypeVar1, pMyTypeVar2;
...
SORT_CMP(*pMyTypeVar, *pMyTypeVar2);
如果宏参数周围的括号丢失,预处理器将产生如下结果:

(*pMyTypeVar1.a - *pMyTypeVar2.a)
由于点运算符比星运算符绑定得更紧,编译器尝试为指针
pMyTypeVar1
pMyTypeVar2
查找成员
a
,但这两个指针都不起作用

按提议使用括号将导致:

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

通过这种方式,编译器首先取消引用
pMyTypeVar1
pMyTypeVar2
,最后能够找到成员
a

,请发布一个小而完整的程序示例,您可以使用该程序对
MyType
记录的简单数组进行排序,这说明了问题;接受的答案解决了问题。感谢您的解释:)
((*pMyTypeVar1).a - (*pMyTypeVar2).a)