2010-05-03 5 views
1

Dans un projet pour lequel j'écris du code, j'ai un pointeur vide, "implementation", qui est membre d'une structure "Hash_map", et pointe vers une structure "Array_hash_map". Les concepts derrière ce projet ne sont pas très réalistes, mais supporter avec moi. Les spécifications du projet demandent que je jette le pointeur vide "implementation" à un "Array_hash_map" avant de pouvoir l'utiliser dans n'importe quelle fonction.Comment est-ce que je lance un pointeur vide à une structure dans C?

Ma question, spécifiquement est, que dois-je faire dans les fonctions pour lancer les pointeurs de vide à la structure souhaitée? Y a-t-il une déclaration en haut de chaque fonction qui les projette ou est-ce que je fais la distribution chaque fois que j'utilise "implementation"?

Voici les typedefs les structures d'un Hash_map et Array_hash_map ainsi que quelques fonctions les utilisant.

typedef struct { 
    Key_compare_fn key_compare_fn; 
    Key_delete_fn key_delete_fn; 
    Data_compare_fn data_compare_fn; 
    Data_delete_fn data_delete_fn; 
    void *implementation; 
} Hash_map; 

typedef struct Array_hash_map{ 
    struct Unit *array; 
    int size; 
    int capacity; 
} Array_hash_map; 

typedef struct Unit{ 
    Key key; 
    Data data; 
} Unit; 

fonctions:

/* Sets the value parameter to the value associated with the 
    key parameter in the Hash_map. */ 
int get(Hash_map *map, Key key, Data *value){ 
    int i; 
    if (map == NULL || value == NULL) 
    return 0; 
    for (i = 0; i < map->implementation->size; i++){ 
    if (map->key_compare_fn(map->implementation->array[i].key, key) == 0){ 
     *value = map->implementation->array[i].data; 
     return 1; 
    } 
    } 
    return 0; 
} 

/* Returns the number of values that can be stored in the Hash_map, since it is 
    represented by an array. */ 
int current_capacity(Hash_map map){ 
    return map.implementation->capacity; 
} 
+0

Est-ce devoir? – bta

+0

en quelque sorte, c'est une petite partie d'un grand projet sur lequel je travaille – Rowhawn

Répondre

4

Vous pouvez lancer chaque fois que vous l'utilisez, ou vous pouvez lancer une fois et sauver la valeur à une variable temporaire. Ce dernier est généralement la méthode la plus propre.

Par exemple, vous pouvez utiliser quelque chose comme:

void my_function (Hash_Map* hmap) { 
    Array_hash_map* pMap; 

    pMap = hmap->implementation; 

    // Now, you are free to use the pointer like it was an Array_hash_map 
    pMap->size = 3; // etc, etc 
} 
+0

Je comprends ce que vous dites, mais un point de désaccord. Le pointeur vide est en fait un champ d'une Hash_map, et pointe également vers une Array_hash_map. Puis-je toujours lancer de la manière map-> implementation = (Array_hash_map *) map-> implementation; où map est un Hash_map passé dans la fonction et l'implémentation est le pointeur vide – Rowhawn

+0

'map-> implementation = (Array_hash_map *) map-> implementation' serait un no-op. Le type associé à un symbole dans une portée donnée est fixé en C - si 'map-> implementation' est de type' void * ', il en sera toujours ainsi. – caf

+0

Je pensais autant. Je pense que je vais juste faire un Array_hash_map et le définir sur le pointeur vide, comme cela a été suggéré. Merci pour l'aide! – Rowhawn