C 斯文森的问题';排序结构时的TIMS排序实现
我发现了Swenson的Timsort的C实现: 在一个较老的SO问题中提到 我遇到了两个问题: 1) 要使用它,我需要定义适合我要排序的类型的SORT_CMP宏。 我的类型定义为(这里有点简化): 我试图定义: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
#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)