2016-03-27 55 views
0

私は2つの頂点のidを比較する関数を書いています。エラー:構造体または共用体ではないメンバー 'id'の要求

/* Returns whether aim and vertex have the same id */ 

bool id_eq(void *aim, void *vertex) { 
    if(*(Vertex)aim.id ==*(Vertex)vertex.id){ 
     return true; 
} 
    return false; 
} 

aimとvertexは、struct vertex_tの2つのポインタです。

typedef struct graph_t* Graph; 
typedef struct vertex_t* Vertex; 

/* A vertex is an id, a label and a list of incoming and outgoing edges */ 
struct vertex_t { 
    int id; 
    char *label; 

    /* A list of vertices representing incoming edges */ 
    List in; 
    /* A List of vertices representing outgoing edges */ 
    List out; 
}; 

しかし、私はそれをコンパイルすると、エラーが発生したとして「ERROR:メンバーの要求 『』何かない構造体または共用体の」IDを。誰かが私がどこに間違って行ったか教えてもらえますか? >または -

+0

'.'は構造体または共用体でのみ使用できます。 'aim'はポインタです。あなたはおそらく '((Vertex)aim) - > id ==((Vertex)vertex) - > id'を意味します。 –

+0

ポインタのtypedefを避けると、コードが読みやすくなります –

+0

aim - > idを使用しようとしましたが、このエラーはまだ発生しています。 –

答えて

1

変更

if(*(Vertex)aim.id ==*(Vertex)vertex.id){ 

if((Vertex)aim->id == (Vertex)vertex->id){ 

または

if((*(Vertex)aim).id == (*(Vertex)vertex).id){ 

(Vertex)に "構造体vertex_tへのポインタ" にaimをキャストします。次に、->演算子を使用してstruct vertex_tidを指し示すことができます。

*(服従)は.->より低い手順を有することに留意されたいです。

+0

あなたより!今すぐ取得しました –

+0

@AbbyMengこの回答があなたの問題を解決すると思う場合は、スコアの下にある灰色の棒をクリックしてそれを受け入れることができます。もちろん、望むなら、それをアップヴォートすることもできます。 –

1

あなたが抱えている問題は、キャスト

if((Vertex)aim.id ==(Vertex)vertex.id)

関数は、2つのボイドポインタ

bool id_eq(void *aim, void *vertex); 

構造を扱うときに覚えている

を受けています。

bool id_eq(void *aim, void *vertex) { 

    return ((Vertex)aim)->id == ((Vertex)vertex)->id ? true:false; 
} 

は編集:

これは

if(((Vertex)aim)->id ==((Vertex)vertex)->id) 

を以下のように解決されなければならないので、私は次のようにリターンをお勧めしますが、それは個人的な好みのキャストの前に考慮されます= trueは既にboolになりますが、コードを少し鮮明にするので、 "?true:false"は必要ありません。

+0

Vertex *をVertexに置き換えて問題を解決しました〜ありがとうございました –

+0

あなたは正しく、typedefを見落としてしまいました、ありがとう!! –