2014-05-22 5 views
0

Im 내 파일을 컴파일 할 때 대학의 프로젝트에 문제가 생겼습니다 (api.c api.h datastruct.c datastruct.h 및 main.c). Makefile로 문제가 datastruct.c 및 datastruct에 있습니다.구조체 typedef가 "불완전한 형식으로 포인터 역 참조 해제"를 일으키는 것은 무엇이 문제입니까?

vertex new_vertex() { 
    /*This functions allocate memorie for the new struct vertex wich save 
    the value of the vertex X from the edge, caller should free this memorie*/ 

    vertex new_vertex = NULL; 

    new_vertex = calloc(1, sizeof(vertex_t)); 
    new_vertex->back = NULL; 
    new_vertex->forw = NULL; 
    new_vertex->nextvert = NULL; 

    return(new_vertex); 
} 

및 파일에 datastruct.hi은 구조 정의가 : h를 할 때이 기능을 컴파일

typedef struct vertex_t *vertex; 
typedef struct edge_t *alduin; 

typedef struct _edge_t{ 
    vertex vecino;  //Puntero al vertice que forma el lado 
    u64 capacidad;  //Capacidad del lado 
    u64 flujo;   //Flujo del lado  
    alduin nextald;   //Puntero al siguiente lado 
}edge_t; 

typedef struct _vertex_t{ 
    u64 verx; //first vertex of the edge 
    alduin back; //Edges stored backwawrd 
    alduin forw; //Edges stored forward 
    vertex nextvert; 

}vertex_t; 

내가 문제 datastruct.h가 datastruct.c에 포함되어 볼 수 없습니다를! 컴파일러의 오류는 다음과 같습니다

gcc -Wall -Werror -Wextra -std=c99 -c -o datastruct.o datastruct.c 
datastruct.c: In function ‘new_vertex’: 
datastruct.c:10:15: error: dereferencing pointer to incomplete type 
datastruct.c:11:15: error: dereferencing pointer to incomplete type 
datastruct.c:12:15: error: dereferencing pointer to incomplete type 
+0

무엇이 문제입니까? 컴파일러 출력 내용을 오류 메시지로 보여주십시오. –

+1

스타일에 대한 의견 : typedef'ing 포인터 내 의견에 큰 실수가 있기 때문에 그것은 당신이 상대하고있는 것을 아는 것이 중요합니다. 나는 그것을 빨아 들여서 꼭 필요한 곳에 struct vertex_t *를 입력했다. –

+0

또한'calloc'을 사용하여 메모리를 할당하고'calloc'은 메모리를 0으로 설정합니다. 그래서 모든 NULL 할당이 필요하지 않습니다. –

답변

2

귀하의 문제는 여기에 있습니다 :

typedef struct vertex_t *vertex; 
typedef struct edge_t *alduin; 

그것은해야한다 :

typedef struct _vertex_t *vertex; 
typedef struct _edge_t *alduin; 
2

내가 그것을 발견했다.

문제는 typedef에 있습니다. C에서 typedef는 새로운 형식 이름을 만듭니다. 그러나 구조체 이름은 유형 이름이 아닙니다.

typedef struct vertex_t *vertextypedef vertex_t *vertex으로 변경하면 오류 메시지가 수정됩니다.

3

은 당신이 쓴 무엇을주의 깊게 읽어

vertex new_vertex = NULL; // Declare an element of type 'vertex' 

그러나 vertex 무엇인가?

typedef struct vertex_t *vertex; // A pointer to a 'struct vertex_t' 

그래서 struct vertex_t은 무엇입니까? 음, 그것은 존재하지 않습니다. 다음과 같은 정의 :

이 정의의
typedef struct _vertex_t { 
    ... 
} vertex_t; 

:

  1. struct _vertex_t
  2. vertex_t

같은 것은 struct vertex_t로 (추론이 edge 비슷). 하나에 당신의 형식 정의를 변경합니다

typedef vertex_t *vertex; 
typedef edge_t *edge; 

또는 :

typedef struct _vertex_t *vertex; 
typedef struct _edge_t *edge; 

문제에 관련없는 등 calloc에 할당하는 모든 회원 제로 것, 사용자 ZAN 살쾡이에 의해 코멘트했다 당신의 구조체이므로 NULL으로 초기화하는 것은 매우 어렵습니다.