2013-04-07 2 views
0

abc 구조의 배열에서 두 요소 사이에 정렬 조건은 변수 "sec"에 따라 달라집니다.붙박이를 qsort 함수의 기능을 비교하는 것이 변수 "전나무는"동일한 경우, 그래서 나는 구조에게 나는 아래의 코드를 사용하는 비교 기능에서</p> <pre><code>typedef struct abc{ long long int fir; long long int sec; }abc; </code></pre> <p>을 정렬 C의 붙박이를 qsort 함수를 사용하는 것을 시도하고있다

long long int cmp(const abc* e1, const abc* e2) 
{ 
if(e1->fir==e2->fir) 
     return e1->sec-e2->sec; 
else 
    return e1->fir-e2->fir; 
} 

코드가 제대로 작동하지 않는 것 같습니다. 올바른 방법은 무엇입니까?

+2

. 여기서 뭐가 문제 야? –

+0

어떻게 작동하지 않습니까? 전화 코드 또는 완전한 작은 프로그램을 게시 할 수 있습니까? – hmjd

+1

비교 함수를 qsort에 지정된 서명과 일치 시키면 좋은 시작이 될 것입니다. int (* compar) (const void *, const void *)이어야합니다. 플랫폼 및 인수 및 반환 값을 처리하는 방법에 따라 중요하지 않을 수도 있습니다. 그런 다음 다시 할 수 있습니다. –

답변

2
long long int cmp(const abc* e1, const abc* e2) 

에는 qsort 비교 함수에 대한 올바른 서명이 없으므로 프로그램에 정의되지 않은 동작이 있습니다. 컴파일러 경고 플래그를 높게 설정해야하며 경고 메시지가 표시됩니다.

실제 테스트는 뺄셈이 오버플로되지 않는 한 괜찮습니다. 이것은 오랫동안 문제가되지 않았을 것입니다. 편집 결과는 cmp의 반환 값이 int이어야하기 때문에 여기에서는 뺄셈이 적절하지 않습니다. 뺄셈 결과가 long long이므로 큰 값을 입력하면 결과가 너무 커서 int에 적합하지 않으며 qsort은 잘못된 순서를 생성합니다.

는 더 일반적으로,하지만,이 더 정확 : 좋아

int cmp(const void* v1, const void* v2) 
{ 
    const struct abc* p1 = v1; 
    const struct abc* p2 = v2; 

    if (p1->fir < p2->fir) 
     return -1; 
    else if (p1->fir > p2->fir) 
     return 1; 
    else 
     return p1->sec < p2->sec? -1 : p1->sec > p2->sec? 1 : 0;  
} 
+0

올바른 구현을위한 코드를 게시 할 수 있습니까? – learner

+0

@learner 나는 편집을 참조한다. –

+0

테스트 할 수있는 빠른 코드를 만들었지 만 제대로 작동하지 않는 것 같습니다. - http://pastebin.com/tM2f7N0P – learner

0

사용중인 내장 qsort에 "lower than"(연산자 <) 조건 자 (C++의 일반적인 용어)가 필요합니다. 그리고 당신의 주장은 논쟁이 동일하지 않은 한 두 경우 모두에서 사실로 돌아갑니다.

진정한 IFF를 반환해야합니다 (해당하는 경우에만) e1<e2.

+1

"내장 qsort에"lower - than "(연산자 <) 술어"-가 틀립니다. "C++의 일반적인 용어"-이 태그는 C++가 아니라 C 태그입니다. –

+0

@JimBalter 네 말이 맞아. 나는 그 사과에 대해 눈치 채지 못했다. 나는 당신의 대답을 그렇게 upvoted 처음 그래서, 그리고 내게 머물거야 .. 어쩌면 그는 C로 업그레이 드거야 + + 언젠가 :) – rmn

+0

사실. 나는 C 언어를 35 년 동안 썼고 C 언어 표준위원회에있었습니다 ... 오늘 그 글은 그 유산 코드가 아니면 심각한 실수입니다. 사람들이 초보자들에게 이런 것들을 가르치고 있다는 것은, 특히 http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of와 같은 것들이있을 때, 가증 스럽습니다. -computer-programs-spring-2005/index.htm을 사용할 수 있습니다. –