50 votes

Tableaux associatifs en C

Je suis en train de mettre en place un moyen de transférer un ensemble de données vers un dongle programmable. Le dongle est basé sur une technologie de carte à puce et peut exécuter un code arbitraire à l'intérieur. Les données d'entrée et de sortie sont transmises sous forme de blocs binaires accessibles via des pointeurs d'entrée et de sortie.

Je voudrais utiliser un tableau associatif pour simplifier le code de traitement des données. Tout devrait fonctionner de cette manière :

D'abord l'application hôte :

// Host application in C++
in_data["method"] = "calc_r";
in_data["id"] = 12;
in_data["loc_a"] = 56.19;
in_data["loc_l"] = 44.02;
processor->send(in_data);

Ensuite, le code à l'intérieur du dongle :

// Some dongle function in C
char* method_name = assoc_get_string(in_data, "method");
int id = assoc_get_int(in_data, "id");
float loc_a = assoc_get_float(in_data, "loc_a");
float loc_l = assoc_get_float(in_data, "loc_l");

Ma question porte donc sur la fonctionnalité de la partie dongle. Existe-t-il un code C ou une bibliothèque pour implémenter un tel comportement de tableau associatif comme ci-dessus ?

0 votes

Il y a une implémentation des tableaux associatifs dans le livre de David R Hanson. C Interfaces et implémentations (1996). C'est très pratique, mais pas complètement trivial. Dans le livre, ils sont appelés "tableaux".

23voto

msalvadores Points 8768

La table de hachage de Glib. implémente une interface map ou (tableau associatif). Et c'est très probablement l'implémentation de table de hachage la plus utilisée en C.

GHashTable *table=g_hash_table_new(g_str_hash, g_str_equal);

/* put */
g_hash_table_insert(table,"SOME_KEY","SOME_VALUE");

/* get */
gchar *value = (gchar *) g_hash_table_lookup(table,"SOME_KEY");

11voto

Hasturkun Points 18653

Essayez uthash est une bibliothèque d'en-tête implémentant une table de hachage en C. Elle est petite et assez facile à utiliser.

11voto

Mark Wilkins Points 29291

Je pense qu'il faudrait que vous écriviez le vôtre. Si je comprends l'architecture que vous décrivez, vous devrez envoyer l'ensemble des données en un seul morceau. Si c'est le cas, alors la plupart des bibliothèques ne fonctionneront pas pour cela, car elles alloueront probablement plusieurs morceaux de mémoire, ce qui nécessitera plusieurs transferts (et une compréhension interne de la structure). Cela reviendrait à essayer d'utiliser une fonction de hachage d'une bibliothèque et d'envoyer son contenu sur le réseau via un socket en passant simplement le pointeur Root à la fonction send fonction.

Il serait possible d'écrire ses propres utilitaires pour gérer un tableau associatif très simple (ou hachage) dans un seul bloc de mémoire. Si la quantité de données est faible, il pourrait utiliser une simple recherche linéaire pour les entrées et serait un bout de code assez compact.

0 votes

Oui, vous avez raison. La fonction de traitement des données dans le dongle traite un seul élément de données. J'ai vraiment l'impression que je dois implémenter un simple tableau associatif avec des indices de 8 caractères et un algorithme de recherche d'index linéaire ! Je pensais juste ne pas réinventer la roue et demander si quelqu'un l'avait déjà implémenté.

0 votes

Je suis tout à fait d'accord pour ne pas réinventer la roue. Et il est fort probable que quelqu'un l'ait déjà fait... mais le trouver pourrait s'avérer difficile car il s'agit d'un domaine plutôt spécialisé.

3voto

James Points 3829

Oui, mais cela ne fonctionnera pas de la manière que vous avez indiquée. Il utilisera plutôt un struct pour stocker les données et les fonctions qui opèrent sur cette structure, vous donnant le résultat que vous voulez. Voir Une simple bibliothèque de tableaux associatifs en C . Exemple d'utilisation :

struct map_t *test;

test=map_create();
map_set(test,"One","Won");
map_set(test,"Two","Too");
map_set(test,"Four","Fore");

2voto

Matt Joiner Points 29194

Le programme de GLib Tables de hachage y Arbres binaires équilibrés pourrait être ce que vous cherchez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X