Wie kann ich warf einen void-Zeiger auf eine struct in C?
In einem Projekt, das ich bin das schreiben von code für, ich habe einen void-Zeiger, "Umsetzung", der ein Mitglied einer "Hash_map" Struktur und verweist auf eine "Array_hash_map" struct. Die Konzepte, die hinter diesem Projekt sind nicht sehr realistisch, aber Geduld mit mir. Die Spezifikationen des Projektes bitten, dass ich warf den void-Zeiger "Umsetzung" zu einer "Array_hash_map", bevor ich es verwenden kann, in der alle Funktionen.
Meine Frage speziell ist, was mache ich in den Funktionen cast von void-Zeiger an die gewünschte Struktur? Gibt es eine Anweisung am Anfang jeder Funktion, wirft Sie zu oder mache ich die Besetzung jedes mal, wenn ich "Umsetzung"?
Hier sind die typedefs die Strukturen einer Hash_map und Array_hash_map sowie ein paar Funktionen, die Sie nutzen.
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;
Funktionen:
/* 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;
}
- Ist dieses Hausaufgaben?
- Art, es ist ein kleiner Teil eines großen Projekts an dem ich arbeite
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie werfen es jedes mal, wenn Sie es verwenden, oder Sie werfen kann, ist es einmal und speichern Sie den Wert in eine temporäre variable. Letzteres ist in der Regel die sauberste Methode.
Beispielsweise könnten Sie so etwas wie:
map->implementation = (Array_hash_map *) map->implementation
wäre das ein no-op. Der Typ wird durch ein symbol in einem bestimmten Umfang ist fest in C - wennmap->implementation
ist der Typvoid *
es ist immer so.