1

qsortの比較関数を作成しようとしていますが、ダブルポインターの逆参照に問題があります。

構造を定義しました

typedef struct {
    float x;
    float y;
} point;

そして私はポイントするポインタの配列を作りました:

point* ptarr[2]={pt1,pt3} //pt1 and pt3 have type point*

私の比較関数は次のように定義されています。

int compare(const void * a, const void * b){
    return *(point**)a->x-*(point**)b->x;  //This is wrong
}

aとbは配列内の値へのポインターであるため、私の場合、それらは構造体ポイントを指すポインターへのポインターです。したがって、それらをダブルポインター(ポイント**)にキャストし、それを1回逆参照して、struct内の値にアクセスしようとしました。コンパイラーから「構造体または共用体ではないものでのメンバー'x'の要求」エラーが発生しました

私はこれについて本当に混乱しています。誰かがそれを手伝ってくれる?ありがとう

4

2 に答える 2

1

本当に、これは単なる構文上の問題です。

return *(point**)a->x-*(point**)b->x;        // This is wrong

return (*(point**)a)->x - (*(point**)b)->x;  // This is right

*x->yと同じであるためにエラーが発生する理由は、*(x->y)必要です(*x)->y

また、コードにバグがあります。

point* ptarr[2]={pt1,pt3} // pt1 and pt3 have type point

バグがわかりますか?pt1およびpt3はタイプpoint *(この場合はコメントが間違っています)であるかpt1、およびをとpt3で置き換える必要が&pt1あり&pt3ます。コメントのエラーはバグとして扱われるべきなので、どちらにしてもバグです。

于 2013-02-05T06:55:42.167 に答える
1

演算子の優先順位に関する参照テーブルを確認すると、->アクセス演算子の優先順位が型キャストよりも高いことがわかります。これは、式(point**)a->xが実際には構造体ポインターxではなくメンバーを型キャストすることを意味します。aあなたは例えば欲しいです(*(point**)a)->x

于 2013-02-05T06:56:14.777 に答える