2014-02-08 2 views
0

그래서 qsort를 사용하여 "key"라는 구조체 내의 int 값을 기반으로 구조체 배열을 정렬합니다. 하지만 내 배열이 제대로 채워 지긴하지만, 그것은 내 구조체를 정렬하는 것으로 보이지 않습니다 ...qsort 비교 함수가 호출되지 않았습니까?

그것은 qsort가 결코 내 비교 함수를 호출하지 않는 것처럼 보일 것입니다. 함수 내의 print out 문에 대한 간단한 테스트는 이것을 보여줍니다. 내 "테스트"는 나타나지 않습니다.

비교 기능 :

int compare (const void *a, const void *b){ 
    struct Record* a_r = (struct Record*)(a); 
    struct Record* b_r = (struct Record*)(b); 

    /*test*/ 
    printf("test"); 

    return (a_r->key - b_r->key); 
} 

내를 qsort 전화 :

qsort(arr, (sizeof(arr)/sizeof(struct Record)), sizeof(struct Record), compare); 

이 문제가 내 비교 기능과인가? 아니면 올바른 변수를 전달하지 않습니까?

내 어레이 선언 : 도착이 struct Record *를 정의한 바와

struct Record *arr = malloc(size->st_size); //where st_size is stat() of input file 

답변

3

sizeof(arr)은 포인터의 크기이다. struct Record의 크기로 나눌 수 있습니다.

파일에 레코드 만 있고 전체 파일을 읽고 있다고 가정하면 size->st_size/sizeof(struct Record)을 사용하십시오. 또는 어쨌든 어쨌든 다른 수의 레코드가 필요할 것이므로 입력 파일을 읽은 다음 변수를 설정하고 해당 변수를 사용하십시오.

+0

Ohmygoodness, 예. 와우. 나는 그것을 놓치기 때문에 어리석은다고 느낀다. – katiea

1

당신은 sizeof(Record) 같거나 포인터의 크기보다 큰, sizeof(arr)는 추론에 의해, 포인터의 크기가하고 있기 때문에 size->st_size/sizeof(struct Record)보다는 sizeof(arr)/sizeof(struct Record)을 통과해야 (그래서 당신은 그렇게, qsort()qsort()를 0 또는 1 요소를 통과 크기가 0 또는 1의 배열이 이미 정렬되어 있기 때문에 비교기를 호출 할 필요가 없다. 아마도

, size->st_sizestruct Record입니다 각각의 고정 길이 레코드 파일의 크기입니다. 그렇지 않으면, malloc() 아무튼 ' 많은 의미가 있습니다.