2010-05-03 3 views
1

В проекте, над которым я пишу код, у меня есть указатель на пустоту, «реализация», который является членом структуры «Hash_map» и указывает на структуру «Array_hash_map». Концепции этого проекта не очень реалистичны, но несут меня. Спецификации проекта требуют, чтобы я применил указатель void «реализация» к «Array_hash_map», прежде чем я смогу использовать его в любых функциях.Как мне указать указатель void на struct в C?

Мой вопрос, в частности, что мне делать в функциях, чтобы отличать указатели void к желаемой структуре? Есть ли один оператор в верхней части каждой функции, которая их бросает, или я делаю приведение каждый раз, когда я использую «реализацию»?

Ниже перечислены структуры struct Hash_map и Array_hash_map, а также функции пары, использующие их.

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; 

функции:

/* 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

Является ли это домашнее задание? – bta

+0

своего рода, это небольшая часть большого проекта, над которым я работаю – Rowhawn

ответ

4

Вы можете привести его каждый раз, когда вы используете его, или вы можете бросить его один раз и сохранить значение временной переменной. Последний, как правило, самый чистый метод.

Например, вы могли бы использовать что-то вроде:

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

Я понимаю, что вы, ребята, говорите, но один момент раздора. Указатель void фактически является полем Hash_map, а также указывает на Array_hash_map. Могу ли я использовать метод map-> implementation = (Array_hash_map *) map-> реализация; где map - это Hash_map, переданный в функцию, а реализация - указатель void – Rowhawn

+0

'map-> implementation = (Array_hash_map *) map-> implementation' будет нерабочим. Тип, связанный с символом в заданной области, фиксируется в C - если 'map-> implementation' имеет тип' void * ', он всегда должен быть таким. – caf

+0

Я так понял. Я думаю, что я просто создам Array_hash_map и установлю его на указатель void, как было предложено. Спасибо за помощь! – Rowhawn