2013-04-26 4 views
3

qsort를 사용하여 구조체 배열을 정렬하는 데 문제가 있습니다. 나는이 프로그램을 실행하면 그것은 나를 gp의 모든 값에 대한 구조 1과 0에 원래 있던 이름을 지 웁니다 제공 http://support.microsoft.com/kb/73853qsort 구조 배열이 모든 것을 삭제합니다.

:

나는 예제로이 링크를 사용했다.

typedef int (*compfn)(const void*, const void*); 

struct record 
{ 
    char player[20]; 
    int gp; 
}; 
struct record entries[15]; 

int compare(struct record *, struct record *); 


void show()   
{ 
    int v; 
    qsort((void *)entries, 10, sizeof(struct record), (compfunc)compare); 
    struct record *p = entries; 
    for(v=0;v<counter;v++, p++) 
    { 
     printf("%s ..... %d \n", p->player , p->gp); 
    } 
} 

int compare(struct record * p1, struct record * p2) 
{ 
    if(p1->gp < p2->gp) 
     return -1; 
    else if (p1->gp > p2->gp) 
     return 1; 
    else 
     return 0; 
} 

편집 : 이봐, 난이 모든 것을 당신이 사람이 말했다 그것은 여전히 ​​사실 외에도 제로

+0

이것은 컴파일해서는 안됩니다. –

+1

(compfunc)에서 (compfn)을 제외하고 나를 위해 일하는 것 – 999k

답변

0

에 이르기까지 모든 값을 변 했어요, 그래서 모든 도움을 많이하지만 모두의 덕분에 그 마이크로 소프트 지원 페이지 코드가 여기에 & 누락, 진짜 엉망이 아닌 C 학습을위한 좋은 소스입니다 :

... 
qsort((void *)entries, 10, sizeof(struct record), (compfunc)compare); 
... 

이어야

,733 (210)

또한, 나는 당신이 쓰는 의미 생각

... 
qsort((void *)&entries, 15, sizeof(struct record), (compfn)compare); 
... 
+0

식에서 사용할 때 배열 이름은 암시 적으로 포인터로 변환됩니다. –

+0

@luserdroog 알아. 필자는 Microsoft 지원 페이지와 OP를 통해 제공되는 코드에 최대한 가깝게 접근하고자했습니다. –

+0

아, 알겠습니다. 나는 그 페이지를 보는데 귀찮게하지 않았다. 왜 그들이'(void *) (struct record *) & entries [0]'을 쓰지 않는지 궁금합니다. 훨씬 명확합니다. :) –

2
귀하의 호출을 단순화 할 수

, void *으로 캐스팅 할 필요 : sizeof entries[0]

qsort(entries, 10, sizeof entries[0], compare); 

주 사용이 배열의 무의미한 반복을 피하기 위해 유형. (?) 단지 정보로, 그런데

static int compare(const void *a, const void *b) 
{ 
    const struct record *ra = a, *rb = b; 

    if(ra->gp < rb->gp) 
    return -1; 
    if (ra->gp > rb->gp) 
    return 1; 
    return 0; 
} 

여기에 고전적인 방법 : 단순히 프로토 타입에 맞게 정의해야하기 때문에

은 어느 비교 함수의 어떤 캐스팅이 없어야합니다 초보자있어 특히하지 않을 경우

return (ra->gp < rb->gp) ? -1 : (ra->gp > rb->gp); 

내가에 대한 을 주장하지 않습니다을 표현하는이 방법,하지만 난을 포함 거라고 생각했다 : 가끔이 같은 장소에서 볼 수있는 3 웨이 테스트를 tersify 그게 관련이 있기 때문에 본 것은 가르침을받은 사람 일 것입니다.

+0

내가 본 "고전적"방법은'return (ra-> gp> rb-> gp) - (ra-> gp < rb-> gp);' – caf

+1

내가 본 "고전적인"방법은'return (ra-> gp-rb-> gp)'이지만 윈도우의 qsort가 비교 함수의 결과를 { 1, 0, 1}이면, 리눅스 qsort는 그렇지 않다. –