2010-01-31 4 views
1

J'essaie d'enrouler ma tête autour de C maintenant (principalement comment les pointeurs fonctionnent). J'essaye d'écrire cette fonction décrite ci-dessous:Problème avec la fonction d'insertion de la table de hachage dans C

/* EnterName entrez un nom dans une table de symbole. Renvoie une valeur booléenne indiquant si une entrée pour Nom était déjà répertoriée dans le tableau. Renvoie un argument contenant une référence d'entrée pour le nom.

De toute façon, voici le code que j'ai écrit et je ne sais pas comment le tester pour le moment. Vous vous demandez si quelqu'un pourrait regarder par-dessus et laissez-moi savoir si je fais bien.

Merci d'avance.

code ::

bool EnterName(struct SymTab *ATable, 
       const char *Name, 
       struct SymEntry * *AnEntry) 
{ 
       char name = *Name; 
       unsigned hashval = hash (&name); 
       struct SymEntry *ptr; 

      ptr = ATable->Contents[hashval]; 

      while(ptr != NULL) 
      { 
        if(strcmp(ptr->Name, &name)) 
        { 
           AnEntry = &ptr; 
           return true; 
        } 
      } 

      ptr = malloc(sizeof(struct SymEntry)); 
      ptr->Name = &name; 
      AnEntry = &ptr; 
      return false; 

}

+1

Je ne sais pas ce que vous nous demandez de faire : compilez votre code pour vous? Écrire un harnais de test? Qu'avez-vous essayé jusqu'à présent? –

+0

quel compilateur utilisez-vous? Si c'est gcc alors je vous recommande fortement de passer un niveau d'alerte élevé: '-Wall' –

Répondre

3

-t-il courir et produire les résultats que vous attendez?

Il n'y a pas de remplacement pour compiler du code, l'exécuter avec des données de test, comparer les résultats aux valeurs attendues, déboguer, etc, lors de l'apprentissage d'une nouvelle langue. Montrer le code non testé aux autres et demander si c'est OK n'est pas la bonne approche.

Même les deux premières lignes de la fonction ne font pas de sens:

char name = *Name; 
    unsigned hashval = hash(&name); 

Vous venez de prendre le premier caractère de Name dans la variable name et essayez ensuite de hachage son adresse.

Maintenant, la boucle:

  while(ptr != NULL) 
      { 
        if(strcmp(ptr->Name, &name)) 
        { 
           AnEntry = &ptr; 
           return true; 
        } 
      } 

n'a pas de sens non plus, puisque vous n'êtes pas avancer ptr partout - c'est une boucle infinie.

Cela dit, il semble y avoir un pas dans la bonne direction dans votre code. Vous devez juste obtenir vos types droits et réparer tous les coins rugueux. Je suggère de commencer avec de petits morceaux - voir qu'ils compilent et courent, puis procéder à l'assemblage en plus gros morceaux.

+0

Il compile, ne produit pas les résultats que je voudrais. Je suppose que c'est la raison pour laquelle je me sens dépassé par cette situation. Je ne comprends pas comment fonctionnent les pointeurs. Je suppose que c'est pourquoi je cherche de l'aide. – James

+3

@unknown: Je n'essaie pas de prêcher, mais sincèrement d'aider. Lire un livre de débutant sur C, lire des articles en ligne (ceci est un bon tutoriel sur les pointeurs: http://home.netcom.com/~tjensen/ptr/pointers.htm). Il y a des dizaines de questions concernant le fonctionnement des pointeurs - il suffit de regarder. Mais commence vraiment avec un livre/tutoriel. –

+0

merci, c'est exactement ce que je cherchais. – James

0

Je peux détecter au moins une erreur. Vous ne faites que hacher la première lettre de chaque nom ...
name = un seul caractère (une copie) hash (& name), hache la copie du caractère unique. Vous voulez hash (nom), avec une majuscule, de sorte que vous donniez le début de la piqûre à hash, de sorte qu'il peut hacher le tout.

0
char name = *Name; 

Cela prend le premier caractère de Name et le stocke dans name (La chaîne Hello serait tronquée à un seul H). Vous voulez certainement name être char* (pointeur vers un tableau de caractères) au lieu d'un seul caractère.

strcmp(a,b) renvoie 0 si a correspond à b.Je pense qu'il devrait être

if(!strcmp(ptr->Name, name)) 

En outre, votre boucle peut s'exécuter pour toujours. Si la première comparaison échoue (à condition d'ajouter le!), la boucle continuera indéfiniment puisque la valeur de ptr ne changera jamais.

Il y a beaucoup de problèmes dans votre code. Vous devez le tester. Prenez un compilateur, compilez-le, lancez-le. La programmation sans test n'est pas possible.

0

Ce

AnEntry = &ptr; 

ne fait pas ce que vous voulez faire. Il modifie la valeur de la variable locale AnEntry sans modifier la valeur dans la routine appelante.

Vous vouliez

*AnEntry = ptr; 

Et il y a plusieurs autres bugs et erreurs probables, mais ils semblent être assez bien couvert par d'autres ...

Questions connexes