2012-01-09 3 views
0

구조 포인터의 배열을 정렬하는 방법에 관해서 stackoverflow에 관한 많은 질문이 있습니다. 나는 그들 모두를 보았다. 아무 소용이 없다. 구조체 배열에 대한 포인터 배열을 정렬하고 싶습니다. 우선 포인터 배열에 대한 저장 공간을 할당 한 다음 구조 자체에 대한 저장 공간을 할당합니다. 모두 괜찮아 보이지만, 나는 그들을 분류 할 수 없습니다. 문제가 비교 기능에 있다고 확신합니다. 나는 stackoverflow에서 그들 중 몇 가지를 복사했습니다, 그들은 아래에 나열되어 있습니다. 그러나 그들 중 누구도함수는 배열 포인터의 배열에 대해 int를 비교하는 함수입니다.

typedef struct s_stream{ 
int amc; 
char *name; 
} dataStream; 

void abc(void) 
{ 
     int count = 100; 

    dataStream *_UniqueStreamBuild = calloc(count, sizeof(dataStream)); 
    dataStream **UniqueStreamBuild = calloc(count, sizeof(dataStream *)); 
    for (int i = 0; i < count; ++i) UniqueStreamBuild[i] = _UniqueStreamBuild + i; 

//**Edit: ******** ** 
     // here I call a cascade of functions that assign values to amc; those 
     // functions are correct: they produce an unsorted array of amc values; 
     // the output I am getting is an array of structures seemingly in random order. 

    qsort(UniqueStreamBuild, count, sizeof(dataStream *), compare); 
} 

int compare (const void * a, const void * b) 
{ 
    const dataStream *x = a; 
    const dataStream *y = b; 

    if (x->amc > x->amc) 
     return(1); 

    if (x->amc < x->amc) 
     return(-1); 

    return(0); 
} 


int compare(const void *a, const void *b) 
{ 
    dataStream *m1 = *(dataStream **)a; 
    dataStream *m2 = *(dataStream **)b; 

    if (m1->amc > m2->amc) 
     return(1); 

    if (m1->amc < m2->amc) 
     return(-1); 

    return(0); 
} 
+0

중복 가능성 [C에서 구조체의 배열을 정렬하는 방법? (http://stackoverflow.com/questions/8721189/how-to-sort-an-array-of-structs-in- c) –

+0

예상 출력과 실제 출력이 포함 된 자기 만족적이고 정확한 결과를 제공 할 수 있습니까? http://sscce.org –

+0

두 번째 비교 기능이 작동해야한다고 생각합니다. 첫 번째 것은 잘못되었습니다. David이 말했듯이 완전한 프로그램, 입력, 예상 출력 등을 제공해야합니다. 설명은 비교 기능이 아닐 수도 있습니다. –

답변

1

두 번째 가능한 compare() 기능은 약간의 차이가 아니라면 내가 바로 아래에이 버전 사이에 통지를하지 않았다 작동합니다 ... 작동하지 않습니다. 포인터의 배열을 정렬 할 때, 비교 기능이 따라서 비교기이 매우 유사해야하는 dataStream *에 두 개의 포인터를 전달됩니다

int compare (const void *a, const void *b) 
{ 
    const dataStream *x = *(const dataStream **)a; 
    const dataStream *y = *(const dataStream **)b; 

    if (x->amc > y->amc) 
     return(1); 
    else if (x->amc < y->amc) 
     return(-1); 
    else 
     return(0); 
} 

또한, 원래 작성된, 당신의 기능 중 하나는 항상 0을 반환 x->amc == x->amc 때문에 (xy 대신에 x을 두 번 참조 취소하십시오).

테스트 코드가 데이터 구조를 완전히 초기화하지 않습니다.이 구조체는 calloc()을 사용하므로 구조체의 문자열과 포인터가 모두 0으로 설정되므로 정렬 작업이 많지 않습니다.


이 코드는 저에게 맞습니까?

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

typedef struct s_stream 
{ 
    int amc; 
    char *name; 
} dataStream; 

static int compare(const void *a, const void *b) 
{ 
    const dataStream *x = *(const dataStream **)a; 
    const dataStream *y = *(const dataStream **)b; 

    if (x->amc > y->amc) 
     return(1); 
    else if (x->amc < y->amc) 
     return(-1); 
    else 
     return(0); 
} 

static void dump(FILE *fp, const char *tag, dataStream * const * const data, int num) 
{ 
    const char *pad = ""; 
    fprintf(fp, "Stream Dump (%s): (%d items)\n", tag, num); 
    for (int i = 0; i < num; i++) 
    { 
     fprintf(fp, "%s%d", pad, data[i]->amc); 
     if (i % 10 == 9) 
     { 
      putc('\n', fp); 
      pad = ""; 
     } 
     else 
      pad = ", "; 
    } 
    putc('\n', fp); 
} 

static void abc(void) 
{ 
    int count = 100; 

    dataStream *_UniqueStreamBuild = calloc(count, sizeof(dataStream)); 
    dataStream **UniqueStreamBuild = calloc(count, sizeof(dataStream *)); 
    for (int i = 0; i < count; ++i) 
    { 
     UniqueStreamBuild[i] = _UniqueStreamBuild + i; 
     UniqueStreamBuild[i]->amc = (7 * i + 3) % count + 1; 
    } 

    dump(stdout, "Before", UniqueStreamBuild, count); 
    qsort(UniqueStreamBuild, count, sizeof(dataStream *), compare); 
    dump(stdout, "After", UniqueStreamBuild, count); 

    free(_UniqueStreamBuild); 
    free(UniqueStreamBuild); 
} 

int main(void) 
{ 
    abc(); 
    return 0; 
} 
+0

사실 Q의 두 번째 버전이 제대로 작동하는 것처럼 보입니다. 왜 다른 결과를 기대합니까? –

+0

나는 작동하지 않는 테스트 프로그램을 만들 때까지 눈치 채지 못했습니다. 그게 전부입니다. –

+0

예, 완벽하게 작동합니다. 두 비교 : dataStream 전에 "const"누락 오류가 무엇입니까? 명확하고 간결하며 정중 한 도움을 주셔서 감사합니다. – PaeneInsula

관련 문제