c - Dereferencing pointer to incomplete type -
i new c programming , mini project decided try implement stack in c using oop style structure in file genericstack.h shown below:
void _genericstack0001(void *,void *); void *_genericstack0002(void *); int _genericstack0003(void *); typedef struct { struct genericstacknode *next; void *data; int type; }genericstacknode; typedef struct { struct genericstacknode *top; int count; void (*add)(void *,void *); void *(*pop)(void *); int (*hasnext)(void *); int (*getcount)(void *); }genericstack; genericstack newgenericstack() { genericstack *genstack = malloc(sizeof(genericstack)); genstack->add = _genericstack0001; genstack->pop = _genericstack0002; genstack->hasnext = _genericstack0003; genstack->getcount = _genericstack0003; genstack->top=null; genstack->count = 0; return *genstack; } void _genericstack0001(void *self,void *data)//add { genericstack *genstack = self; if(genstack->top == null) { genstack->top = malloc(sizeof(genericstacknode)); genstack->top->next = null; genstack->top->type = 0; genstack->top->data = data; } else { genericstacknode *temp = malloc(sizeof(genericstacknode)); temp->next = genstack->top; temp->type = 0; temp->data = data; genstack->top = temp; genstack->count++; } } void *_genericstack0002(void *self)//pop { genericstack *genstack = self; void *data = null; if(genstack->top == null) { return data; } else { genericstacknode *temp = genstack->top; genstack->top = genstack->top->next; data = temp->data; free(temp); genstack->count--; return data; } } int _genericstack0003(void *self) { genericstack *genstack = self; return genstack->count; }
all need know why (among many others) specific error:
genericstack.h:41:16: error: dereferencing pointer incomplete type genstack->top->type = 0;
i have checked other answers on stackoverflow concerning "dereferencing pointer incomplete type" cant seem understand.
you're getting error genericstack
, have problem in both genericstack
, genericstacknode
.
in c, struct x
, x
different types. when write:
struct genericstacknode *next;
it declares type called struct genericstacknode
(and member pointer type). type incomplete because have not provided struct definition.
the type completed providing struct definition later, never that. instead, define unnamed struct , typedef genericstacknode
, has no effect on struct genericstacknode
.
then, struct genericstacknode *top;
still uses same incomplete type, not struct defined above.
assuming meant pointer pointer same type of struct it's contained in, use pattern both of structs:
typedef struct x x; struct x { x *ptr; };
often people combine typedef struct definition find clearer have them separate.
Comments
Post a Comment