2017-11-07 44 views
0

構造体の配列をint値に基づいてソートしようとしています。私は正常に構造体の配列をソートしましたが、私は入れ子構造体のどこかで間違った値を渡していると思います。qsort構造体の配列の配列

私は配列の構造体にaの値をソートするだけでいいです。

構造体は以下のように設定されています

int comp(const void *a, const void *b){ 

    struct s1 *q1 = (struct s1 *)a; 
    struct s1 *q2 = (struct s1 *)b; 

    return(q1->arr->a - q2->arr->a); 
} 

そして、私はqsortを呼び出す:私は比較する機能を持っている

struct s2{ 
    int a; 
    int b; 
}; 

struct s1{ 
    int c; 
    struct s2 arr[10]; 
} 

入力の場合

struct s1 myStruct; 
size_t theLen = sizeof(myStruct.arr)/sizeof(struct s2); 
qsort(myStruct.arr, 10, theLen, comp); 

10, 5, 7, 20, 17, 9, 3, 11, 15, 1 

私は出力を得る:

2147451181, 589824, 327680, 65536, 131072, 4, 5, 11, 15, 8 

は、私は私が長さを宣言する方法とは何かかもしれ推測していますか?

ありがとうございます!

ファイルの行は、次のとおり

10 5 7 20 17 9 3 11 15 1 

myStruct.arr [I] .Aは関数fgetsとsscanf関数を使用して、ファイル入力から充填される。

fgets(t, sizeof(t), fp); 
sscanf(t, "%d,...,%d", &myStruct.arr[0].a,...,&myStruct.arr[9].a); 

myStruct.arr [i]は.Bでありますforループでいっぱい:

for(int i = 0; i < 10; i++){ 
    myStruct.arr[i].b = i+1; 
} 

答えて

1

あなたはを使うべき場所を比較することq1->arr->aを使用しているあなたのコード

  1. を持つ2つの間違いがあります。(q1のタイプはconst struct s2です)。これは@GauravSehgalによっても説明されていますanswer

  2. qsortの3番目の引数を見ると、実際にバイト単位で比較される各要素のサイズです。しかし、あなたは要素の数を渡しました。

    qsort(myStruct.arr, 10, sizeof(struct s2), comp);

を、あなたが希望する結果を取得する必要があります - にあなたの呼び出しを変更します。

あなたは(@Stargateurの指摘)の世話をする必要があるいくつかの他のポイントがあります -

  1. あなたはconst修飾子を破棄したくないので、タイプconst struct s2*であることがq1q2を宣言。彼らはどんなconst型のポインタに自動-促進タイプconst void*であるためq1q2に割り当てるab明示的ながら

  2. はキャストしないでください。

+0

私は、OPのキャストが間違っていると付け加えます(そして、無効な 'void const *'は自動昇格です)。なぜならそれはconstの修飾子を破棄しているからです: 'struct s2 const * q1 = a; struct s1 const * q2 = b; ' – Stargateur

+0

@Stargateurありがとう、私はメモを追加します。 –

1
qsort(myStruct.arr, 10, theLen, comp); 

あなたは0123をソートします各要素は、あなたの比較の.soタイプstruct s2であり、ここでは

int comp(const void *a, const void *b){ 

struct s2 *q1 = (struct s2 *)a; 
struct s2 *q2 = (struct s2 *)b; 

return(q1->a - q2->a); 
} 

EDITする必要があります:qsortへの三番目のパラメータは、それがあるべきsorted.Soように、配列の各要素の大きさである

qsort(myStruct.arr, theLen, sizeof(struct s2), comp); 
+0

これは間違いなく私が持っていたものよりも理にかなっているが、残念ながら、それはまだランダム出力を与えている:4、589824、11、65551、131072、65536、5、196608、0、17、私は言うべきではありませんランダム...毎回同じ出力です。 – Strobe00

+0

'myStruct.arr'を埋め込む完全なコードを表示する必要があります –

+0

私は質問にコードを追加しました。 – Strobe00