2017-01-30 18 views
0

Эй, ребята, я встречаю указатель на разыменование неполного типа. это очень странно. Мне нужна помощь 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); 

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 // часть теста

#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; 
} 

Я так растерялся, потому что я сделал
ЬурейеЙ структуры graphRep * Graph , что означает, что struct с указателем. Но все-таки есть эти ошибки

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.c

Move struct graphRep в файл Graph.h интерфейса.

+0

, но для хороших ADT это должно быть скрыто. Я сделал несколько графических домашних заданий, которые наставник не позволил изменить интерфейс, и все они отлично справляются. –

+1

Вы можете это сделать, но вы не можете разыменовать указатель на эту 'struct'. Таким образом, весь доступ к этой структуре должен быть реализован функцией 'get/set' в файле' Graph.c' и сделать доступным для других, используя файл интерфейса '.h'. – LPs