cyber101
cyber101

Reputation: 2994

C dereferencing pointer to incomplete type struct

In the tree.h header, I declared "struct privates" in order to hide the global variables. (relevant snippet)

 struct privates;
  /*
   * a tree
     */

    typedef struct tree_node
    {
        struct tree *left; 
        struct tree *right; 
        struct tree_node *left; 
        struct tree_node *right; 
        float * info;  
        float distance_to_neighbor;
    } tree_node;


  typedef struct tree
  {
   /*in order to  keep track of the kd-tree root*/
   tree_node * _root; 
   /*pointer to internal variables struct*/
   struct privates* _privates;  

  } tree;

struct privates* init_heap_tree();

etc....

In the implementation file kdtree.c , I defined the "struct privates": (relevant snippet)

tree* my_tree=NULL; 

typedef struct  privates
{

/*variables*/
int current_number_of_tree_nodes; 
/*previous tree rebuild's node count*/ 
int previous_tree_size;
} privates; 


privates* init_heap_tree()
  {
      return (privates*) calloc(1, sizeof (privates));
  }


tree* tree_get_tree()
{
    my_tree = get_pre_allocated_tree();
    return my_tree;  
}

etc...

Now in the memory management code, see relevant snippet of init_heap().

I’m attempting to set initialize values for struct members "tree_space->_privates->current_number_of_tree_nodes = 0;"

void
init_heap (int max_dimensions)
{
    tree_space = (tree *) calloc (tree_HEAP_SIZE, sizeof (tree));
    tree_space = get_pre_allocated_tree();
    tree_space->_privates = init_heap_tree();
    //THIS  IS WERE COMPILE  TIME ERROR OCCURS
    tree_space->_privates->current_number_of_tree_nodes = 0; 
    tree_space->_privates->previous_tree_size =0;  
    //allocate memory based on tree_HEAP_SIZE
    tree_space = (tree_node*) calloc (tree_HEAP_SIZE, sizeof (tree_node));
    tree_set_k_dimensions (max_dimensions);

etc...

}

"error: dereferencing pointer to incomplete type "struct privates"

I don't want any other design pattern for information hiding perse, How can I resolve this error with the struct member access?

Thanks a million.

Upvotes: 1

Views: 126

Answers (1)

dbush
dbush

Reputation: 223689

Only functions in kdtree.c can access the members of private, so you need to do the initialization there.

privates* init_heap_tree()
{
    privates *rval = calloc(1, sizeof (privates));
    rval->current_number_of_tree_nodes = 0;
    rval->previous_tree_size = 0; 
    return rval;
}

Upvotes: 1

Related Questions