2016-07-13 2 views
0

У меня возникли проблемы с секцией загрузки pset5 на CS50, было бы здорово, если бы кто-то мог помочь. Я пытаюсь загрузить trie, который читает из словаря (файл fp ниже), а затем повторяется через буквы, чтобы создать trie.CS50 pset5 Функция загрузки

Я понимаю концепцию построения trie, но я думаю, что мне не хватает чего-то с тем, как настроены указатели на структуру (надеюсь, я не отстаю от трека с приведенным ниже кодом). Я попытался настроить «ловушку» для навигации по каждому этапу попытки.

В настоящее время я получаю ошибку сегментации, поэтому не совсем уверен, куда идти дальше. Любая помощь будет широко оценена.

/** 
* Loads dictionary into memory. Returns true if successful else false. 
*/ 
bool load(const char* dictionary) 
{ 
    //create word node and set root 

    typedef struct node { 
     bool is_word; 
     struct node* children[27]; 
    } node; 

    node* root = calloc(1, sizeof(root)); 
    root -> is_word = false; 
    node* trav = root; 

    //open small dictionary 

    FILE* fp = fopen(dictionary, "r"); 
    if (fp == NULL) 
    { 
     printf("Could not open %s.\n", dictionary); 
     return false; 
    } 

    //read characters one by one and write them to the trie 

     for (int c = fgetc(fp); c != EOF; c = fgetc(fp)) 
     { 

      //set index using to lower. Use a-1 to set ' to 0 and other letters 1-27 

      int index = tolower(c)-('a'-1); 

      //if new line (so end of word) set is_word to true and return trav to root) 

      if (index == '\n') 
      { 
       trav->is_word = true; 
       trav = root; 
      } 

      //if trav-> children is NULL then create a new node assign to next 
      //and move trav to that position 

      if (trav->children[index] == NULL) 
      { 
       node* next = calloc(1, sizeof(node)); 
       trav->children[index] = next; 
       trav = next; 
      } 

      //else pointer must exist so move trav straight on 

      else { 
       trav = trav->children[index]; 
      } 

    } 

    fclose(fp); 

    return false; 
} 
+0

Не прочитал вопрос, просто слепое предложение, вы проверили [cs50.se]? –

+0

Да, просмотрели все видео и пошаговые руководства, но все равно ударились головой о стену – jamiej

+0

, какое видео? Я говорю о сайте SE .. вы проверяете ссылку в своем комментарии? –

ответ

0

Я предполагаю, что вы установите размер массива children[] для хранения 26 букв алфавита плюс апострофы. Если это так, когда fgetc(fp) возвращает апостроф с кодом acsii 39 (я думаю), то index будет установлен на -57, который определенно не является частью trav->children. Вероятно, вы получаете segfault (или хотя бы одно из мест) .

Надеюсь, это поможет.

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

  • Нет связанных вопросов^_^