2013-12-07 8 views
0

Я получаю сообщение об ошибке, связанной с элементом структуры.Поле имеет неполный тип?

struct trie { 
     char ch; 
     bool isEnd; 
     struct trie arr[4]; 
     struct trie *next; 
}; 

Ошибка:

error: field ‘arr’ has incomplete type 
+0

вы должны направить объявление 'trie'. в противном случае его неполный тип, когда он пытается использовать себя внутри структуры – amdixon

+4

@amdixon Не решит проблему. 'struct' не может содержать себя. –

+4

Итак, ваша тройка содержит четыре попытки, каждая из которых будет содержать четыре попытки, каждая из которых содержит четыре попытки, .... – Mat

ответ

2

Вы можете определить вашу структуру таким образом

struct trie { 
    char ch; 
    bool isEnd; 
    struct trie *arr[4]; 
    struct trie *next; 
}; 

Обратите внимание, что (чтобы избежать бесконечной рекурсии) arr теперь представляет собой массив из четырех указатели каждый ссылается на структуру trie, которую вам придется динамически распределять по вашему коду.

Вы можете выделить (синтаксическое дерева неинициализированного, конечно) с этой функцией:

struct trie *alloc_trie() { 
    return malloc(sizeof(struct trie)); 
} 

Обратите внимание, что четыре Trie указал на четыре пунктов обр не выделяется. Также нет следующий.

3

Вы не можете поместить структуру в себе (просто подумайте об этом, это не имеет смысла). Это вызовет «бесконечную рекурсию» относительно типа. Возможно, вы можете уйти с другим указателем на struct trie, для которого вы можете динамически распределять память. Но я не уверен, чего вы пытаетесь достичь. Возможно, вам нужен массив указателей? struct trie *arr[4] или аналогичный.

-1

вперед объявить как:

typedef struct trie trie; 

struct trie { 
    char ch; 
    int isEnd; //bool unsupported for c89 so.. 
    trie *arr; //have to manually alloc 4 trie here.. 
    trie *next; 
}; 

Редактировать: удалить подчеркивание из имен, как указано в разделе 7.1.3 Reserved Identifiers проекта c99 стандарта [указанном в комментарии]

+1

Перспективная декларация не является проблемой. Проблема заключается в массиве (который вы удалили в своем ответе). – karadoc

+1

Не нужно пересылать объявление. 'struct _trie * next' выполнит эту работу. – alk

+1

Идентификаторы (или теги struct) в глобальной области действия, которые начинаются с '_', являются« no no ». Просто использование 'trie' для обоих будет делать трюк. –

Смежные вопросы