C разыменование указателя на структуру неполного типа - PullRequest
1 голос
/ 28 февраля 2020

В заголовке tree.h я объявил "struct privates", чтобы скрыть глобальные переменные. (соответствующий фрагмент)

 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....

В файле реализации kdtree. c я определил "struct privates": (соответствующий фрагмент)

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...

Теперь в коде управления памятью см. Соответствующий фрагмент init_heap ().

Я пытаюсь установить значения инициализации для членов структуры "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...

}

» ошибка: разыменование указателя на неполный тип «struct privates»

Мне не нужен какой-либо другой шаблон проектирования для скрытия информации perse, Как я могу разрешить эту ошибку с помощью доступа к элементу структуры?

Спасибо, миллион.

1 Ответ

1 голос
/ 28 февраля 2020

Только функции в kdtree. c могут получить доступ к элементам private, поэтому вам нужно выполнить инициализацию там.

privates* init_heap_tree()
{
    privates *rval = calloc(1, sizeof (privates));
    rval->current_number_of_tree_nodes = 0;
    rval->previous_tree_size = 0; 
    return rval;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...