2010-12-11 6 views
4

Je voudrais définir une table de hachage avec une fonction de hachage permutable. La fonction de hachage prendrait un pointeur sur la table de hachage et la clé pour hacher, retourner un int comme ceci:Référence circulaire pour typedef de pointeur de fonction dans C

typedef int (hash_function_t) (hashtable *, int); 

où les magasins Hashtable un pointeur à la fonction qui sera utilisée pour les clés de hachage:

typedef struct ht { 
    size_t size; 
    ... 
    hash_function_t *hash_function; 
} hashtable; 

Malheureusement, cela crée une référence circulaire. J'ai besoin du pointeur vers la table de hachage dans la définition de la fonction de hachage, donc je peux faire un module par rapport à la taille de la table de hachage, donc il ne dépasse pas le nombre maximum de seaux. J'ai besoin de la fonction de hachage dans la hashtable pour ne pas avoir à passer le pointeur de fonction de hachage partout.

Je sais que cela conduira à un code comme:

*ht->hash_function (ht, key) 

qui est un peu bizarre, mais je suis bien avec ça. Mettre les typedefs dans l'un ou l'autre ordre ne fonctionne pas.

Dois-je utiliser la définition longue dans la table de hachage, puis faire un typedef après, ou y a-t-il un meilleur moyen?

Ceci est tout prévu en C, pas C++. Les solutions ANSI C préférées!

Répondre

11

Vous pouvez déclarer la structure avant de l'utiliser dans une définition. Cela indique au compilateur que la structure existe, mais elle sera complètement définie plus tard. Quelque chose comme ceci:

/* declare it first */ 
struct ht; 

typedef int (hash_function_t) (struct ht *, int); 

typedef struct ht { 
    size_t size; 
    ... 
    hash_function_t *hash_function; 
} hashtable; 
+0

Hah! Nice et simple. Je ne savais pas que vous pouviez déclarer et ensuite «re-déclarer» une structure. Merci beaucoup! – majelbstoat

+0

Maintenant vous faites! :-) J'ai eu le même problème quand j'apprenais C et implémenté une liste chaînée ... –