2012-01-09 5 views
0

構造体ポインタの配列をソートする方法については、stackoverflowに関する多くの質問があります。私はそれらをすべて見て、役に立たなかった。私は構造体の配列へのポインタの配列をソートしたい。私は最初にポインタ配列のための記憶域を割り当て、次に構造体そのものに記憶域を割り当てます。すべてのことがうまく見えるが、私はそれらを並べ替えることはできません。私は問題が比較機能にあると確信しています。私はstackoverflowからそれらのいくつかをコピーしました。それらは以下にリストされています。しかし、それらのどれも動作していない、私はちょうど下のそれとこのバージョンの間で気付かなかった、いくつかの違いがありますしない限り...関数は、qsortを使用しているときに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

私はあなたの2番目の比較機能が動作するはずだと思います。最初のものは間違っています。デービッドの言うとおり、完全なプログラム、入力、期待される出力などを提供するべきです。説明は比較機能ではないかもしれません。 –

答えて

1

あなたの第二の可能なcompare()機能が動作するはずです。ポインタの配列をソートする場合、比較関数は、したがって、コンパレータはこれに非常に類似しているはず、dataStream *への2つのポインタを渡されます。

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を2回参照する)。

あなたのテストコードはデータ構造を完全には初期化しません - それはcalloc()を使用しているので、構造体の中の文字列とポインタはすべてゼロになります。


このコードは私のために機能します...あなたはどうですか?

#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の2番目のバージョンは動作するはずです。なぜこれとは異なる結果が出ると思いますか? –

+0

私は実際のテストプログラムを作るまで、気がつかなかった。 –

+0

はい、完全に動作します。 2つを比較すると、dataStreamの前にある "const"を省略したときのエラーですか?明確で簡潔で丁寧な助けをいただきありがとうございます。 – PaeneInsula

関連する問題