ToxicSockWarrior
ToxicSockWarrior

Reputation: 120

error: dereferencing pointer to incomplete type

Looked through many other SO posts related to this, but none were able to help me. So, I have the following structs defined:

 typedef struct
    {
    int created;
    double data;
    int timeLeft;
    int destination;
}dataPacket;

typedef struct
{
    dataPacket *array;
    int currIndex;
    int firstIndex;
    int nextTick;
    int maxLength;
    int length;
    int stime;
    int total;


}packetBuffer;

typedef struct{
    int mac;
    struct wire *lconnection;
    struct wire *rconnection;
    int numRecieved;
    struct packetBuffer *buffer;
    int i;
    int backoff;
}node;

typedef struct{
    float length;
    float speed;
    int busy;
    struct dataPacket *currPacket;
    struct node *lnode;
    struct node *rnode;
}wire;

And then I'm trying to use the following function:

    int sendPacket(node *n, int tick)
{
    if(n->buffer->length > 0)
    {
        if(n->backoff <= 0)
        {
            if (n->lconnection->busy != 0 || n->lconnection->busy != 0)
            {
                n->i++;
                n->backoff = (512/W * genrand()*(pow(2,n->i)-1))/TICK_LENGTH;
            }
            else
            {
                n->lconnection->busy = 1;
                n->rconnection->busy = 1;
                n->lconnection->currPacket = n->buffer[n->buffer->currIndex];
                n->rconnection->currPacket = n->buffer[n->buffer->currIndex];
            }
        }
        else
        {
            n->backoff--;
        }
    }
}

I'm getting the error described in the title everytime I try to access a member of buffer, lconnection, or rconnection.

Upvotes: 2

Views: 425

Answers (2)

acarlow
acarlow

Reputation: 924

The following:

typedef struct { int x; char *y; ... } my_struct;

creates an identifier for an anonymous structure. In order, for a structure to refer to an instance of itself, it must not be "anonymous":

typedef struct my_struct {
    int x;
    char *y;
    struct my_struct *link
    ....
} my_struct_t;

This means that my_struct_t is now the type struct my_struct and not just an anonymous struct. Also, note that struct my_struct can be used within its own structure definition. That is not possible with anonymous structs.

As a final complication, the my_struct in struct my_struct is in a differenct "namespace" than the my_struct_t. This is sometimes used to to simplify (or confuse) things in code like this:

typedef struct my_struct {
    int x;
    char *y;
    struct my_struct *link
    ....
} my_struct;

Now I can use my_struct anywhere in my code instead of struct my_struct.

Finally, you could separate the typedef from the structure definition to achieve the same effect:

struct my_struct {
    int x;
    char *y;
    struct my_struct *link;
    ....
};
typedef struct my_struct my_struct;

As noted in David R.Hanson's C Interfaces and Implementations, "This definition is legal because structure, union, and enumeration tags occupy a same name space that is separate from the space for variables, functions, and type names."

Upvotes: 1

Keith Thompson
Keith Thompson

Reputation: 263237

struct packetBuffer *buffer;

You've defined a type packetBuffer (a typedef for an otherwise anonymous struct).

You haven't defined struct packetBuffer.

In the absence of an existing type struct packetBuffer, the compiler treats it as an incomplete type, assuming that you'll complete it later. The declaration

struct packetBuffer *buffer;

is perfectly legal, but you can't dereference buffer unless the type struct packetBuffer is visible.

Just drop the struct keyword.

(My personal preference is to drop the typedef and consistently refer to struct types as struct whatever, but that's a matter of style and taste.)

Upvotes: 5

Related Questions