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]?
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. –
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. –
Désolé, j'ai mis à jour le mot de code et j'ai juste oublié de poster ici: char * word = NULL; –