2017-01-30 11 views
0

私は、不完全な型への逆参照ポインターを満たしています。それは非常に奇妙です。私はGraph.c //実装の一部を投稿ここでは非常に奇妙なエラーです。不完全な型へのポインタの逆参照

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <string.h> 
#include "Graph.h" 

struct graphRep { 
    int V; 
    int E; 
    int **edges; 
} 


int validV(Graph g, Vertex v); 

int validV(Graph g, Vertex v){ 
    return (v >= 0 && v < g->V); 
} 
// Create an edge from v to w 
Edge mkEdge(Vertex v, Vertex w,int weight) { 
     assert(v >= 0 && w >= 0 ); 
     Edge e = {v,w,weight}; 
     return e; 
} 
Graph newGraph(int nV) { 

    assert(nV >= 0); 
    int i,j; 
    Graph g = malloc(sizeof(struct graphRep)); 
    assert(g!=NULL); 
    if(nV==0){ 
     g->edges = NULL; 
    } else { 
     g->edges = malloc(nV*sizeof(int *)); 
    } 
    for(i = 0; i < nV;i++){ 
     g->edges[i] = malloc(nV * sizeof(int)); 
     assert(g->edges[i] != NULL); 
     for(j = 0; j < nV; j++){ 
     g->edges[i][j] = 0; 
     } 
    } 
    g->V = nV; 
    g->E = 0; 
    return g; 
} 

testGraph.c //テスト

の一部 Graph.h //無向重み付きグラフアルゴリズムインターフェース

typedef int Vertex; 

typedef struct { 
    Vertex v; 
    Vertex w; 
    int weight; 
} Edge; 

Edge mkEdge(Vertex, Vertex, int); 

typedef struct graphRep *Graph; 

Graph newGraph(int nV); 

void insertE(Graph g, Edge e); 

を助けが必要

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <string.h> 
#include "Graph.h" 
int main(void){ 
     printf("boundary test for newGraph\n"); 
     Graph g = newGraph(0); 
     assert(g!=NULL); 
     assert(g->V == 0 && g->E ==0 && g->edges == NULL); 
     printf("test passed!\n"); 
     free(g); 
     return 0; 
} 

私はそれがある意味
typedefは構造体graphRep *グラフ をしたので、私はとても混乱していますポインタを持つ構造体。 しかし、まだこれらのミス

wagner % gcc -Wall -Werror Graph.c testGraph.c 
In file included from testGraph.c:3:0: 
testGraph.c: In function 'main': 
testGraph.c:30:12: error: dereferencing pointer to incomplete type 
    assert(g->V == 0 && g->E ==0 && g->edges == NULL); 
      ^
testGraph.c:30:25: error: dereferencing pointer to incomplete type 
    assert(g->V == 0 && g->E ==0 && g->edges == NULL); 
         ^
testGraph.c:30:37: error: dereferencing pointer to incomplete type 
    assert(g->V == 0 && g->E ==0 && g->edges == NULL); 
            ^

誰かが私に助けを得たT T

+1

struct graphRepは "testGraph.c"ファイルでは不明です。 graphRepの詳細を隠したい場合は、不透明なポインタのコンセプトを使用できます。 – rajesh6115

答えて

2

testGraph.c構造体がGraph.hインタフェースファイルにGraph.c

移動struct graphRepに定義されて見ることはできません。

+0

しかし、良いADTのためには、それは隠されるべきです。先生がインタフェースを変更することを許可していないグラフの宿題をいくつかやったことがあります。彼らはすべてうまくやっています。 –

+1

あなたはそうすることができますが、その 'struct'へのポインタを逆参照することはできません。したがって、その構造体へのアクセスは、 'Graph.c'ファイルの' get/set'関数によって実装され、 '.h'インタフェースファイルを使って他の人が利用できるようにする必要があります。 – LPs

関連する問題