Получение ошибки "узел не имеет члена" в GCC (c99) для базовой структуры дерева - PullRequest
1 голос
/ 22 февраля 2012

Я пытаюсь реализовать базовую структуру trie в простом старом C, и я получаю ошибку «узел не имеет члена» при компиляции.

Вот мое определение структуры:

typedef struct node {
    bool word;
    struct node *alpharray[26];
} node;

Мои попытки инициализировать некоторые узлы следующие:

node *root = malloc(sizeof(node));
node *nptr = malloc(sizeof(node));
nptr = root;

Приведенный выше код использует "итератор" в качестве указателя, который будет циклически проходить по заданной структуре дерева при ее создании. Вот как это работает:

while (ch != '\n' && !feof(fp))
{
    //get the array index value for the current character (ch)
    //getCharNum() returns an int 0-25 corresponding to a slot for a node's alpharray
    int char_num = getCharNum(ch);

    //if a character has not been put in the given slot yet, make a new node and point    
    if (nptr->alpharray[char_num] == NULL)
    {
        node *newnode = malloc(sizeof(node));
        nptr->alpharray[char_num] = newnode;
        nptr = newnode;
    }

    //otherwise, move the main pointer to the next node in the chain of nodes
    else
    {
        nptr = nptr->alpharray[char_num];
    }

    //get the next character
    fread(&ch, sizeof(char), 1, fp);
}

Ошибка, которую я получаю при компиляции, повторяется каждый раз, когда я пытаюсь получить доступ и / или изменить любой заданный атрибут узла. Я также попробовал нотацию * node.alpharray, которая, как я понимаю, эквивалентна вышеописанной, поскольку на ноду будет разыменовываться.

Я знаю, что это, наверное, что-то простое, что я упускаю из виду, но я не могу найти решение где-либо. Идеи?

Вот вывод компилятора:

gcc -ggdb -std=c99 -Wall -Werror   -c -o dictionary.o dictionary.c
dictionary.c:30:15: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token
dictionary.c: In function 'load':
dictionary.c:74:21: error: 'node' has no member named 'alpharray'
dictionary.c:77:21: error: 'node' has no member named 'alpharray'
dictionary.c:84:28: error: 'node' has no member named 'alpharray'
dictionary.c:71:17: error: variable 'char_num' set but not used [-Werror=unused-but-set-variable]
dictionary.c:93:16: error: 'node' has no member named 'word'
cc1: all warnings being treated as errors

make: *** [dictionary.o] Error 1

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Вы забыли инициализировать указатели в массиве.Попробуйте:

struct node {
    bool word;
    struct node *alpharray[26];
};

struct node *node_new(void)
{ 
struct node * ret;
unsigned uu;

ret = malloc (sizeof *ret);
if (!ret) return ret;

ret->word = false;
for (uu = 0; uu < 26 ; uu++) {
   ret->alpharray[uu] = NULL;
   }
return ret;
}

int main(void)
{
struct node *root , *nptr;
root = node_new();

for (nptr=root; (ch = fgetc( fp)) != EOF; ) {
     if (ch == '\n') break;
        //get the array index value for the current character (ch)
    //getCharNum() returns an int 0-25 corresponding to a slot for a node's alpharray
    int char_num = getCharNum(ch);

    //if a character has not been put in the given slot yet, make a new node and point    
    if (nptr->alpharray[char_num] == NULL)
        {
        nptr->alpharray[char_num] = node_new();
        }

    nptr = nptr->alpharray[char_num];
    }

}
0 голосов
/ 22 февраля 2012

Ваш 'alpharray' должен быть объявлен как:

struct node** alpharray[26];

потому что в строке:

nptr->alpharray[char_num] = newnode;

Вы назначаете указатель на структуру (что недопустимо). Объявление вашего узла должно быть:

typedef struct node {
bool word;
struct node** alpharray[26];
} node;

Когда компилятор видит ваше (оригинальное) объявление 'alpharray', он не может понять размер каждого элемента в массиве (потому что тип еще не полностью определен). Вот почему он не может работать иначе, чем с массивом указателей (что вы сделали, это массив «struct node», а не массив указателей на «struct node» - что вы должны делать).

0 голосов
/ 22 февраля 2012

Если вы инициализируете свой узел как:

node *nptr = malloc(sizeof(node));

Вы создаете пространство для самого узла, но не для каждого из указателей в

struct node *alpharray[26];

Поскольку alpharray будет иметь значение NULL, выне может использовать это, чтобы получить элемент этого непосредственно.Вы также должны использовать malloc для этих элементов.

...