문제

나는 C를 오랫동안 오랫동안 쓰지 않았기 때문에 어떻게 이런 종류의 재귀적인 일을 해야하는지 잘 모르겠습니다. 각 셀이 다른 셀을 포함하기를 원하지만 "필드 'child'라인은 불완전한 유형을 가지고 있습니다. 무슨 일이야?

typedef struct Cell {
  int isParent;
  Cell child;
} Cell;
도움이 되었습니까?

해결책

분명히 세포는 끝없는 재귀가되기 때문에 다른 세포를 포함 할 수 없습니다.

그러나 셀은 다른 셀에 대한 포인터를 함유 할 수 있습니다.

typedef struct Cell {
  bool isParent;
  struct Cell* child;
} Cell;

다른 팁

C에서는 구조 자체와 함께 만들고있는 typedef를 참조 할 수 없습니다. 다음 테스트 프로그램에서와 같이 구조 이름을 사용해야합니다.

#include <stdio.h>
#include <stdlib.h>

typedef struct Cell {
  int cellSeq;
  struct Cell* next; /* 'tCell *next' will not work here */
} tCell;

int main(void) {
    int i;
    tCell *curr;
    tCell *first;
    tCell *last;

    /* Construct linked list, 100 down to 80. */

    first = malloc (sizeof (tCell));
    last = first;
    first->cellSeq = 100;
    first->next = NULL;
    for (i = 0; i < 20; i++) {
        curr = malloc (sizeof (tCell));
        curr->cellSeq = last->cellSeq - 1;
        curr->next = NULL;
        last->next = curr;
        last = curr;
    }

    /* Walk the list, printing sequence numbers. */

    curr = first;
    while (curr != NULL) {
        printf ("Sequence = %d\n", curr->cellSeq);
        curr = curr->next;
    }

    return 0;
}

표준에서 이것보다 훨씬 더 복잡하지만 컴파일러가 알고있는 것으로 생각할 수 있습니다. struct Cell 첫 번째 줄에 typedef 그러나 알지 못합니다 tCell 마지막 줄까지 :-) 그것이 내가 그 규칙을 기억하는 방법입니다.

이론적 인 관점에서 언어는 자기 포함 구조가 아닌 자기 참조 구조 만 지원할 수 있습니다.

이것에 관한 일종의 방법이 있습니다.

struct Cell {
  bool isParent;
  struct Cell* child;
};

struct Cell;
typedef struct Cell Cell;

이렇게 선언하면 Compiler에게 Struct Cell과 Plain-Ol'- 세포가 동일하다는 것을 올바르게 알려줍니다. 따라서 정상처럼 셀을 사용할 수 있습니다. 그래도 초기 선언 자체 내부에서 구조 셀을 사용해야합니다.

나는이 게시물이 오래되었음을 알고 있지만, 당신이 찾고있는 효과를 얻으려면 다음을 시도 할 수 있습니다.

#define TAKE_ADVANTAGE

/* Forward declaration of "struct Cell" as type Cell. */
typedef struct Cell Cell;

#ifdef TAKE_ADVANTAGE
/*
   Define Cell structure taking advantage of forward declaration.
*/
struct Cell
{
   int isParent;
   Cell *child;
};

#else

/*
   Or...you could define it as other posters have mentioned without taking
   advantage of the forward declaration.
*/
struct Cell
{
   int isParent;
   struct Cell *child;
};

#endif

/*
    Some code here...
*/

/* Use the Cell type. */
Cell newCell;

위의 코드 조각에 언급 된 두 경우 중 하나에서는 아동 세포 구조를 포인터로 선언해야합니다. 그렇지 않으면 "필드 'child'에 불완전한 유형이 있습니다."오류가 발생합니다. 그 이유는 컴파일러가 사용할 때 할당 할 공간을 알기 위해 "구조 셀"을 정의해야하기 때문입니다.

"struct cell"의 정의 내에서 "struct cell"을 사용하려고 시도하면 컴파일러는 아직 "구조 셀"이 얼마나 많은 공간을 취해야하는지 알 수 없습니다. 그러나 컴파일러는 이미 포인터가 얼마나 많은 공간을 차지하는지 알고 있으며 (전방 선언과 함께) "셀"은 "구조 셀"의 유형이라는 것을 알고 있습니다 (아직 "구조 셀"이 얼마나 큰지는 아직 모르겠지만 아직. ). 따라서 컴파일러는 정의되는 구조물 내에서 "셀 *"을 정의 할 수 있습니다.

TypEdef의 기본 정의를 살펴 보겠습니다. typedef 사용 기존 데이터 유형에 대한 별칭을 사용자 정의하거나 내장 한 것입니다.

typedef <data_type> <alias>;

예를 들어

typedef int scores;

scores team1 = 99;

여기서 혼란은 이전에 정의되지 않은 동일한 데이터 유형의 구성원으로 인해 자체 참조 구조와 관련이 있습니다. 따라서 표준 방식으로 코드를 다음과 같이 쓸 수 있습니다.

//View 1
typedef struct{ bool isParent; struct Cell* child;} Cell;

//View 2
typedef struct{
  bool isParent;
  struct Cell* child;
} Cell;

//Other Available ways, define stucture and create typedef
struct Cell {
  bool isParent;
  struct Cell* child;
};

typedef struct Cell Cell;

그러나 마지막 옵션은 보통 우리가하고 싶지 않은 여분의 줄과 단어를 증가시킵니다 (우리는 당신이 아는 너무 게으르다;)). 따라서보기 2를 선호합니다.

또 다른 편리한 방법은 구조를 사용하여 구조 태그를 다음과 같이 사전 유형으로 만드는 것입니다.

//declare new type 'Node', as same as struct tag
typedef struct Node Node;
//struct with structure tag 'Node'
struct Node
{
int data;
//pointer to structure with custom type as same as struct tag
Node *nextNode;
};
//another pointer of custom type 'Node', same as struct tag
Node *node;

그 자체에 대한 참조를 포함하는 구조. 링크 목록의 노드를 설명하는 구조에서 이것의 일반적인 발생. 각 노드는 체인의 다음 노드에 대한 참조가 필요합니다.

struct node
{
       int data;
       struct node *next; // <-self reference
};

모든 이전 답변은 훌륭합니다. 단지 구조에 자체 유형의 인스턴스를 포함 할 수없는 이유에 대한 통찰력을 제공한다고 생각했습니다 (참조가 아닙니다).

구조는 '값'유형, 즉 실제 값을 포함한다는 점에 유의하는 것이 매우 중요하므로 구조를 선언 할 때 컴파일러는 인스턴스에 할당 할 메모리의 양을 결정해야하므로 모든 멤버를 통해 추가하고 추가합니다. 구조물의 모든 메모리를 파악하기 위해 메모리를 올리십시오. 그러나 컴파일러가 동일한 구조물의 인스턴스를 발견했다면 이것은 역설입니다 (즉, 메모리가 얼마나 많은 메모리가 메모리가 얼마나 많은 메모리를 결정 해야하는지 알기 위해 구조 A TAKE!).

그러나 기준 유형이 다릅니다. 구조물 'A'가 자체 유형의 인스턴스에 대한 '참조'를 포함하는 경우 아직 메모리가 얼마나 많이 할당되었는지는 아직 알지 못하지만 메모리가 메모리에 얼마나 많은 메모리가 할당되는지 알 수 있습니다. 주소 (즉, 참조).

HTH

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top