2017-12-17 6 views
-4

내가 만든 트리 필드에서 정보를 얻으려고 노력하고, 내가 제목에 오류를 얻고있다 포인터를 역 참조 : 불완전한 타입에 대한 포인터를 역 참조오류 C - 불완전한 유형

트리 소스 파일 'List_t 구조체'를 :

struct Node_t{ 
Element data; 
char* location; 
struct Node_t* son; 
struct Node_t* next; 
}; 
    struct List_t{ 
Node head; 
copyFunc copyfunc; 
compareFunc compfunc; 
freeFunc freefunc; 
printFunc printfunc; 
}; 

트리 헤더 파일 :

typedef struct Node_t* Node; 
typedef struct List_t* Tree; 
typedef void* Element; 

응용 프로그램 소스 파일 :

Tree t; 
t = createTree(compareInt, copyInt , freeInt, printInt); 
int* x =(int*)malloc(sizeof(int)); 
*x=53; 
Add(t, x); 
char* location; 
location= t->head->location; //here I got the error 
printf(location); 

어떻게해야합니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

감사합니다.

+1

[둘러보기], 특히 [질문]을 가져 가야합니다. – Yunnosch

+0

실제 오류 메시지를 질문에 복사 해 주셔서 감사합니다. 자, 필요한 모든 코드를 질문에 복사하십시오. 여기 링크를 거절하는 유능하고 일반적으로 도움이되는 사람들이 있습니다. 따라서 스크린 샷 바로 가기를 사용하여 좋은 응답 기회를 줄이는 것입니다. – Yunnosch

+0

감사합니다. @Yunnosch 내가 편집했습니다. 지금 그것이 의미가 있기를 바란다. – MaorE

답변

2

struct List_t의 선언은 헤더 파일에 있어야합니다. createTree의 선언과 함께.

당신은 코드의 세 가지를 제공하고, 그들을 식별 한
+0

감사합니다. 그것은 이미 해체되었습니다. 어쩌면 다른 것일까요? – MaorE

+0

@MaorE 윌리엄 (William)이 언급 한 유형이 오류가 발생했을 때 이미 선언되었다고 생각하는 경우, 그 행을 확인하십시오. 트리 소스 파일의 행은 대답이 아님을 유의하십시오. 아니면 안됩니다 - 당신은 소스 파일을 포함하고 있지 않습니까? 이것은 [mcve]를 사용하면 훨씬 쉬울 것입니다. – Yunnosch

+0

컴파일러는 구조체의 선언을 보지 못합니다. 그것은 오류의 의미입니다. 표시되도록 설정해야하며 가장 쉬운 방법은 헤더에 추가하는 것입니다. 이것이 연습이라면 어쩌면 불투명 한 타입을 보여 주려는 의도 일 것입니다. 즉, 구조체 내부를 정점에 도달하지 말고 제공되는 API를 사용해야합니다. –

0

:

  1. 트리 소스 파일 :

  2. 트리 헤더 파일 :

  3. 앱의 소스 파일 :

이러한 파일을 tree.c,라고 부릅시다. 그 안에

#include <stdio.h> 
#include "tree.h" 

:및

당신이 C 소스 파일을 컴파일하는 app.c는 일반적으로 같은 라인을 포함 할 수있는 하나의 .c 파일이 있습니다. 컴파일러가 정의를 위해 다른 파일을 살펴보고 살펴 보는 방법입니다. 당신의 app.c 파일 위의 라인이 포함 된 경우

, 다음 app.c 내부의 코드는 stdio.htree.h에 의해 제공되는 정보의 사용을 할 수 있습니다.

특히, tree.c 내부에 정보를 제공 한 경우이를 참조하는 #include 지정 문이 없기 때문에 해당 정보는 app.c에 표시되지 않습니다.

솔루션은 (다른 사람들이 말했듯이) 당신의 struct 정의와 typedef 진술과 tree.h 파일에 위치하는 공용 인터페이스의 다른 부분을 이동하는 것입니다.

구조체의 멤버를 비공개로 유지하려는 경우 데이터를 반환하는 함수를 제공 할 수 있습니다. 물론, 그 함수의 선언이 공용 인터페이스의 일부가 될 것입니다 때문에뿐만 아니라 tree.h 파일에 있어야합니다합니다 (정의 함수의tree.c에있을 수 있지만, 선언이 공개됩니다).

+0

@MaorE 답안 작성자가 추측 한 가정과 가정을 설명하기 위해이 대답이 취한 추가 노력에 유의하십시오. 실제 MCVE와 코드 견적의 차이점을 보시겠습니까? – Yunnosch