2011-12-09 11 views
1

比較するキーが構造体のプロパティの1つである構造体へのポインタ配列をソートしようとしています。構造体へのポインタのソート配列qsort

私はおそらく比較方法だと思います。

コード例を示します。私は、これは簡単である必要がありますね

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

struct BINARY_ARRAY_RECORD { 
    char *name; 
}; 

int compare(const void *node1, const void *node2) { 
    return strcmp(
     ((struct BINARY_ARRAY_RECORD *) node1)->name, 
     ((struct BINARY_ARRAY_RECORD *) node2)->name 
    ); 
} 

int main() 
{ 
    struct BINARY_ARRAY_RECORD **records; 

    records = malloc(sizeof(struct BINARY_ARRAY_RECORD *) * 2); 

    records[0] = malloc(sizeof(struct BINARY_ARRAY_RECORD)); 
    records[1] = malloc(sizeof(struct BINARY_ARRAY_RECORD)); 

    records[0]->name = malloc(sizeof(char) * (strlen("string2") + 1)); 
    records[1]->name = malloc(sizeof(char) * (strlen("string1") + 1)); 

    strcpy(records[0]->name, "string2"); 
    strcpy(records[1]->name, "string1"); 

    qsort(records, 2, sizeof(records[0]), compare); 

    printf("%s\n", records[0]->name); 
    printf("%s\n", records[1]->name); 

    return 0; 
} 
+4

あなたの問題はどこですか? – AlexTheo

答えて

10

..

int compare(const void *node1, const void *node2) { 
     BINARY_ARRAY_RECORD *ptr1 = *(BINARY_ARRAY_RECORD * const *)node1; 
     BINARY_ARRAY_RECORD *ptr2 = *(BINARY_ARRAY_RECORD * const *)node2; 
     return strcmp(ptr1->name, ptr2->name); 
    } 

そしてまた、私はそれがこのようなものだった場合のqsort関数呼び出しは間違いなく正しいことができると思い、

qsort(records, 2, sizeof(BINARY_ARRAY_RECORD*), compare); 

私は思います3番目の引数は構造体のサイズでなければならず、それが上のようなものであれば間違いなく確実かもしれません..

+0

struct BINARY_ARRAY_RECORD ** records これはstruct BINARY_ARRAY_RECORD *と同じです。 – tomas

+0

私はそれが最初の答えだと思っていましたが、2つ以上のポインタで試してみると失敗します。正解は私にアジャイを与えたものです。私は変数を取り除くために少し編集する。 int型(のconst void *型ノード1、CONST void *型ノード2){ \tリターンのstrcmp( \t \t(*(構造体BINARY_ARRAY_RECORD * constの*)ノード1を比較) - >名前、 \t \t(*(構造体BINARY_ARRAY_RECORD * CONST * )ノード2)→> \t); } – tomas

+0

なぜですか?添字演算子derefererをBINARY_ARRAY_RECORD構造体からBINARY_ARRAY_RECORD構造体に変更する* – tomas

関連する問題