2011-12-02 3 views
2

구조체 실행 배열을 char로 결과 정렬이라는 정렬을 시도하고 있지만 배열을 인쇄해도 아무 것도 정렬되지 않습니다.qsort 구조체 배열이 작동하지 않습니다.

struct run { 
    char name[20], weekday[4], month[10]; 
    (And some more...) 
}; 
typedef struct run run; 

int name_compare(const void *a, const void *b) 
{ 
    run *run1 = *(run **)a; 
    run *run2 = *(run **)b; 
    return strcmp(run1->name, run2->name); 
} 

int count_number_of_different_persons(run results[]) 
{ 
    int i = 0; 


    qsort(results, sizeof(results)/sizeof(run), sizeof(run), name_compare); 

    for(i = 0; i <= 999; i++) 
    { 
    printf("%s\n", results[i].name); 
    } 
    // not done with this function yet, just return 0 
    return 0; 
} 

위의 출력이 정말 당신이 배열에 sizeof를 사용하지 않고 원래

답변

5
int count_number_of_different_persons(run results[]) 

배치가 된 순서대로 이름 만 목록입니다 : 이것 좀 보라 왜냐하면 배열은 포인터로 감쇠되기 때문입니다.

run *run1 = *(run **)a; 

또한 이상한 모습이, 그것은

run *run1 = (run*)a; 

안?

+0

'void * a'와'void * b'는 배열 항목에 대한 포인터입니다. 배열 자체가'run'으로 typedef 된 struct에 대한 포인터로 구성되어 있다면'void * a'의 올바른 형변환은'(run **) a'입니다. 이것은 여전히 ​​포인터에 대한 포인터이므로 구조체에 대한 포인터를 얻으려면이 포인터 포인터를 역 참조해야합니다. 그러므로'* (run **) a'. 그것은 여기처럼 보이지만 배열은 포인터의 배열이 아니라 직선 배열이므로 올바른 캐스트를 '(실행 *) a'라고합니다. (나는 지금이 문제에 부딪쳤다.이 게시물은 다른 사람에게 도움이 될 것이라고 생각했다.) –

+0

@NickBauer, 정말 다른 사람을 도울 수 있기를 바란다.하지만 4 년 후 문맥에서 벗어나서 원래의 질문과 대답을 다시 읽고 다시 생각해 보지 못하게 해독 할 수는 없다. –

3

하나의 문제는 name_compare에 있습니다. 대신이 시도 :

int name_compare(const void *a, const void *b) 
{ 
    run *run1 = (run *)a; 
    run *run2 = (run *)b; 
    return strcmp(run1->name, run2->name); 
} 
3

다음 코드 확인 :

@michel가 언급 한 바와 같이,를 sizeof (배열)가 처리 배열을 통과하면서으로, 포인터의 크기, 배열 크기 자체가 아니라 제공 포인터로. 따라서 count_number_of_different_persons 함수에 요소 수를 보내거나 요소 수의 MACRO를 정의하십시오. 희망이 도움이됩니다. :).

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define NOE 3 

struct run 
{ 
    char name[20]; 
}; 

typedef struct run run; 

int name_compare (const void *a, const void *b) 
{ 
    return strcmp (((run *)a)->name, ((run *)b)->name); 
} 

int count_number_of_different_persons(run results[], int noOfElements) 
{ 
    int i=0; 
    qsort(results, noOfElements, sizeof (run), name_compare); 
    for (i=0; i<noOfElements; i++) 
     printf ("%s\n",results[i].name); 
} 

int main (int argc, char * argv[]) 
{ 
    run a, b, c; 
    run arg[NOE]; 

    strcpy (a.name, "love"); 
    strcpy (b.name, "you"); 
    strcpy (c.name, "i"); 
    arg[0] = a; 
    arg[1] = b; 
    arg[2] = c; 

    count_number_of_different_persons(arg, sizeof(arg)/sizeof(run)); 
}; 
관련 문제