2017-10-13 4 views
-1

J'ai des problèmes avec le pset5, je ne sais pas vraiment comment démarrer le débogage, j'ai regardé les leçons plusieurs fois maintenant et je n'arrive à rien ..Pset5 implémentation de Load using trie

Quand je lance speller.c il me donne une erreur de seg, j'ai couru le débogueur et il se bloque au beggining de la boucle For, voici mon code suit:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <ctype.h> 
#include <string.h> 

#include "dictionary.h" 
// default dictionary 
#define DICTIONARY "dictionaries/large" 

//created the struct node 
typedef struct node 
{ 
    bool is_word; 
    struct node * paths[27]; 
} 
node; 

int letter = 0; 
char * word = NULL; 

/** 
* Returns true if word is in dictionary else false. 
*/ 
bool check(const char *word) 
{ 
//todo 
return false; 
} 

/** 
* Loads dictionary into memory. Returns true if successful else false. 
*/ 
bool load(const char *dictionary) 
{ 
//opens dictionary for reading 
FILE *fp = fopen(DICTIONARY, "r"); 
if (fp == NULL) 
{ 
    return false; 
    unload(); 
} 

//creates the root of the trie 
node *root = malloc(sizeof(node)); 
root -> is_word = false; 

node * trav = root; 

char * word = NULL; 

//start reading the file 
while (fscanf(fp, "%s", word) != EOF) 
{ 
    for (int i = 0; i < strlen(word); i++) 
    { 
     //assing wich path to take 
     char c = fgetc(fp); 
     if (isupper(c)) 
     { 
      letter = tolower (c); 
      letter = letter -'a'; 
     } 
     else if (isalpha(c)) 
     { 
      letter = c; 
      letter = letter -'a'; 
     } 
     else if (c == '\'') 
     { 
      letter = 26; 
     } 
     else if (c == '\0') 
     { 
      trav -> is_word = true; 
     } 
     if (trav -> paths[letter] == NULL) 
     { 
      node *new_node = malloc(sizeof(node)); 
      if (new_node == NULL) 
      { 
       return false; 
       unload(); 
      } 
      //point to new node 
      trav -> paths[letter] = new_node; 
     } 
     else 
     { 
      trav = trav -> paths[letter]; 
     } 
    } 

} 
if (fscanf(fp, "%s", word) == EOF) 
{ 
    fclose(fp); 
    return true; 
} 
return false; 
} 

/** 
* Returns number of words in dictionary if loaded else 0 if not yet loaded. 
*/ 
unsigned int size(void) 
{ 
// TODO 
return 0; 
} 

/** 
* Unloads dictionary from memory. Returns true if successful else false. 
*/ 
bool unload(void) 
{ 
// TODO 
return false; 
} 

Je ne sais pas non comment pointer le new_node vers le nouveau noeud suivant et si je dois avoir des noms différents pour eux. Par exemple, je vais stocker le mot "foo", donc j'ai lu le noeud appelé trav, allez sur le chemin [5] (la lettre f), vérifiez s'il est déjà ouvert, sinon (si c'est NULL) Je crée un nœud appelé new_node et lui pointe le chemin -> paths [5], que je devrais mettre à jour trav pour être le nouveau nœud, donc je le pointe vers son propre chemin [letter]?

+0

Sans rapport avec votre problème, mais vous savez que 'return' renvoie * immédiatement *? Tout code dans la même portée après le 'return' ne sera pas exécuté, c'est ce qu'on appelle * dead code *. Dans la fonction 'load' vous avez un tel * code mort * si vous ne parvenez pas à ouvrir le fichier. –

+0

En ce qui concerne votre problème, où 'word' pointe-t-il lorsque vous le passez à' fscanf'? Le 'fscanf' n'alloue pas de mémoire pour vous. –

+0

Désolé, j'ai mis à jour le mot de code et j'ai juste oublié de poster ici: char * word = NULL; –

Répondre

-1

word est un pointeur NULL. Et fscanf ne (ne peut pas vraiment) allouer de la mémoire pour ce pointeur à pointer. Alors que se passe-t-il lorsque fscanf veut déréférencer word pour écrire les caractères qu'il lit? Vous ne pouvez pas déréférencer un pointeur NULL, cela conduit à un comportement indéfini. Je vous suggère de définir le mot comme un tableau à la place.

Note: Réponse tirée des commentaires