views:

1983

answers:

5

Hi

I haven't been writing C for very long, and so I'm not sure about how I should go about doing these sorts of recursive things... I would like each cell to contain another cell, but I get an error along the lines of "field 'child' has incomplete type". What's up?

typedef struct Cell {
  int isParent;
  Cell child;
} Cell;

Thanks,

z.

PS (Ziggy is also clearly confused by typedef: he has typedefed Cell to Cell and wonders why?)

+14  A: 

Clearly a Cell cannot contain another cell as it becomes a never-ending recursion.

However a Cell CAN contain a pointer to another cell.

typedef struct Cell {
  bool isParent;
  struct Cell* child;
} Cell;
Andrew Grant
+2  A: 

In C (as opposed to C++ where it may be possible, I haven't checked), you cannot reference the typedef that you're creating withing the structure itself. You have to use the structure name, as in the following test program:

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

Although it's probably a lot more complicated than this in the standard, you can think of it as the compiler knowing about struct Cell on the first line of the typedef but not knowing about tCell until the last line :-) That's how I remember that rule.

paxdiablo
+2  A: 

There is sort of a way around this:

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

struct Cell;
typedef struct Cell Cell;

If you declare it like this, it properly tells the compiler that struct Cell and plain-ol'-cell are the same. So you can use Cell just like normal. Still have to use struct Cell inside of the initial declaration itself though.

Benjamin Horstman
+1  A: 

From the theoretical point of view, Languages can only support self-referential structures not self-inclusive structures.

Sundar
From the practical point of view, how big would such an instance of 'struct Cell' actually be?
Marsh Ray
On most machines, four bytes bigger than itself.
TonyK
A: 

A Structure which contain a reference to itself.A common occurrence of this in a structure which describes a node for a link list.Each node needs a referenceto the next node in the chain.

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

DARSHINI DESAI