2012-06-12 7 views
0

Timsort의 Swenson 's C 구현을 찾았습니다 : 이전의 SO 질문 중 하나에서 언급 한 https://github.com/swenson/sort.구조체를 정렬하는 동안 Swenson의 Timsort 구현과 관련된 문제

1) 내가 정렬 할 유형에 적합한 SORT_CMP 매크로를 정의해야이 기능을 사용하려면

나는 두 가지 문제가 발생했습니다. 내가 정의하려고

typedef struct{ 
    int a; 
    int b; 
} MyType 

:

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

을하지만 오류가 점점 계속 : 'A'뭔가 회원은 "요청을 내 타입은 (여기 단순화 조금)로 정의된다

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

중 하나가 작동하지 않습니다 구조 또는 조합 " 나는 어쩌면 x와 y 포인터 수 있지만 것이라고 생각했다. 도와 주실 수 있나요? 나는 C 초보자이고 아마도 뭔가를 놓치고 있습니다.

2) Visual Studio에서이 코드를 컴파일 할 수있는 방법이 있습니까? 그것은 블록의 중간에있는 선언 같은 새로운 C 표준의 내용을 사용하고 cl.exe는이를 받아들이지 않습니다. GCC (mingw)를 사용하여 컴파일했지만 mingw는 VC (O2 또는 O3 플래그 대/Ox과 lc.exe)를 사용하는 것보다 나머지 코드에서 20 % 더 느려서 stdlib qsort 대신 Timsort를 사용하여 얻을 수있는 모든 이점을 얻을 수있었습니다. 그것을 보상하지 않습니다. Pelles 컴파일러에서도 마찬가지입니다. 대부분의 데이터는 부분적으로 정렬 된 시퀀스가 ​​많으며 정렬에는 실행 시간의 약 50 %가 소요되므로 VC로 작동한다고 가정 할 때 여기에서 얻는 이득이 있다고 느낍니다.

+0

'MyType' 레코드의 간단한 배열을 정렬하는 데 사용하는 프로그램의 작고 완전한 예를 게시하여 문제를 보여주십시오. –

+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) 

도트 연산자가 스타 연산자보다 더 엄격하게 바인딩되므로 컴파일러는 pMyTypeVar1pMyTypeVar2 포인터에 대해 멤버 a을 찾지 만 작동하지 않습니다.

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

이 방법은 컴파일러가 처음 pMyTypeVar1pMyTypeVar2를 역 참조 마지막 멤버 a를 찾을 수 있습니다 : 제안 등

사용 괄호로 이어질 것입니다.

+0

이 설명 주셔서 감사합니다 :) –