Man page - hcreate(3)

Packages contains this manual

Available languages:

en fr ja de

Manual

hsearch

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
STANDARDS
HISTORIQUE
NOTES
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r, hsearch_r - Gestion de table de hachage

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <search.h>

int hcreate(size_t nel );
void hdestroy(void);

ENTRY *hsearch(ENTRY item , ACTION action );

#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <search.h>

int hcreate_r(size_t nel , struct hsearch_data * htab );
void hdestroy_r(struct hsearch_data *
htab );

int hsearch_r(ENTRY item , ACTION action , ENTRY ** retval ,
struct hsearch_data *
htab );

DESCRIPTION

Les trois fonctions hcreate (), hsearch () et hdestroy () permettent Ă  l’utilisateur de crĂ©er et de gĂ©rer une table de hachage qui associe une clĂ© (une chaĂźne de caractĂšres) avec des donnĂ©es quelconques. Une seule table de hachage peut ĂȘtre utilisĂ©e Ă  la fois avec ces fonctions.

Les fonctions hcreate_r (), hsearch_r () et hdestroy_r () sont des versions rĂ©entrantes qui permettent d’utiliser plusieurs tables en mĂȘme temps. Le dernier argument htab pointe vers une structure qui identifie la table Ă  utiliser. Le programmeur doit traiter la structure comme opaque (par exemple, il est impossible d’accĂ©der ou de modifier la table de hachage depuis cette structure).

La table doit d’abord ĂȘtre créée avec hcreate (). L’argument nel est le nombre maximal d’élĂ©ments de la table (le maximum ne peut pas ĂȘtre changĂ© pas la suite). L’implĂ©mentation peut dĂ©cider d’augmenter cette valeur, afin d’amĂ©liorer les performances de la table de hachage.

hcreate_r () effectue la mĂȘme tĂąche que hcreate () mais pour les tables dĂ©crites par la structure *htab . La structure pointĂ©e par htab doit ĂȘtre initialisĂ©e avec des zĂ©ros avant le premier appel Ă  hcreate_r ().

La fonction hdestroy () libĂšre la mĂ©moire occupĂ©e par la table de hachage créée par hcreate (). AprĂšs un appel Ă  hdestroy (), une nouvelle table de hachage peut ĂȘtre créée avec hcreate (). La fonction hdestroy_r () effectue la mĂȘme tĂąche pour une table de hachage dĂ©crite par *htab , qui a Ă©tĂ© prĂ©alablement créée par hcreate_r ().

hsearch () cherche dans la table de hachage un Ă©lĂ©ment dont la clĂ© est la mĂȘme que item (au sens de strcmp (3)), et retourne un pointeur sur cet Ă©lĂ©ment si la recherche rĂ©ussit.

L’argument item est du type ENTRY , qui est dĂ©fini dans <search.h> ainsi :

typedef struct entry {
char *key;
void *data;
} ENTRY;

Le champ key pointe vers une chaßne terminée par un caractÚre nul qui est la clé cherchée. Le champ data pointe vers les données associées à la clé.

Le paramÚtre action détermine ce que doit faire hsearch () aprÚs une recherche infructueuse. Si action est égal à ENTER , alors une copie de item est insérée et un pointeur sur ce nouvel élément est renvoyé. Si action est égal à FIND , NULL est renvoyé et data est ignoré.

hsearch_r () est similaire Ă  hsearch (), mais elle opĂšre sur la table de hachage dĂ©crite par *htab , et le pointeur de l’objet trouvĂ© est renvoyĂ© dans *retval et non dans la valeur de retour de la fonction.

VALEUR RENVOYÉE

hcreate () et hcreate_r () renvoient une valeur non nulle en cas de succĂšs. En cas d’erreur, 0 est renvoyĂ© et errno est positionnĂ© pour indiquer l’erreur.

En cas de succĂšs, hsearch renvoie un pointeur vers une entrĂ©e de la table de hachage. Elle renvoie NULL en cas d’erreur, Ă  savoir si action est Ă©gal Ă  ENTER et la table de hachage pleine, ou si action est Ă©gal Ă  FIND et item ne peut pas ĂȘtre trouvĂ©. hsearch_r () renvoie une valeur non nulle en cas de succĂšs et zĂ©ro en cas d’erreur. En cas d’erreur, ces fonctions positionnent errno pour indiquer l’erreur.

ERREURS

hcreate_r () et hdestroy_r () peuvent échouer pour les raisons suivantes :

EINVAL

htab est NULL.

hsearch et hsearch_r peuvent échouer pour les raisons suivantes :

ENOMEM

action est ENTER , key n’a pas Ă©tĂ© trouvĂ© dans la table, et il n’y a plus de place dans la table pour ajouter un nouvel Ă©lĂ©ment.

ESRCH

action vaut FIND et key n’a pas Ă©tĂ© trouvĂ© dans la table.

POSIX.1 spĂ©cifie seulement l’erreur ENOMEM .

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3880611-1.png

STANDARDS

hcreate ()
hsearch
()
hdestroy
()

POSIX.1-2008.

hcreate_r ()
hsearch_r
()
hdestroy_r
()

GNU.

HISTORIQUE

hcreate ()
hsearch
()
hdestroy
()

SVr4, POSIX.1-2001.

hcreate_r ()
hsearch_r
()
hdestroy_r
()

GNU.

NOTES

L’implĂ©mentation des tables de hachage est gĂ©nĂ©ralement plus efficace lorsque la table possĂšde assez d’espace libre pour minimiser les collisions. Typiquement, cela signifie que nel devrait ĂȘtre 25 % plus large que le nombre maximal d’élĂ©ments que l’on souhaite enregistrer dans la table.

Les fonctions hdestroy () et hdestroy_r () ne libĂšrent pas les tampons pointĂ©s par les Ă©lĂ©ments key et data de la table de hachage. Elles ne peuvent pas le faire car elles ne savent pas oĂč ces tampons ont Ă©tĂ© allouĂ©s dynamiquement. Si ces tampons doivent ĂȘtre libĂ©rĂ©s (peut-ĂȘtre car le programme crĂ©e et supprime des tables de hachage de façon rĂ©pĂ©titive, au lieu de crĂ©er un seule table pour toute la vie du programme), alors le programme doit maintenir la liste des tampons libĂ©rables.

BOGUES

SVr4 et POSIX.1-2001 prĂ©cisent que action n’est significatif que pour les recherches infructueuses ; ainsi ENTER ne devrait avoir aucune influence pour une recherche rĂ©ussie. Les implĂ©mentations libc et glibc (antĂ©rieure Ă  la 2.3) ne suivaient pas les spĂ©cifications car elles mettaient Ă  jour les donnĂ©es data de la clĂ© key dans ce cas.

Les entrĂ©es ne peuvent ĂȘtre qu’ajoutĂ©es dans la table, on ne peut pas les supprimer individuellement.

EXEMPLES

Le programme suivant insĂšre 24 Ă©lĂ©ments dans une table de hachage, puis affiche quelques-uns d’entre eux.

#include <search.h>
#include <stdio.h>
#include <stdlib.h>
static char *data[] = { "alpha", "bravo", "charlie", "delta",
"echo", "foxtrot", "golf", "hotel", "india", "juliet",
"kilo", "lima", "mike", "november", "oscar", "papa",
"quebec", "romeo", "sierra", "tango", "uniform",
"victor", "whisky", "x-ray", "yankee", "zulu"
};
int
main(void)
{
ENTRY e;
ENTRY *ep;
hcreate(30);
for (size_t i = 0; i < 24; i++) {
e.key = data[i];
/* les données sont des entiers et non un pointeur vers
quelque chose */
e.data = (void *) i;
ep = hsearch(e, ENTER);
/* il ne devrait pas y avoir d’échec */
if (ep == NULL) {
fprintf(stderr, "l’entrĂ©e a Ă©chouĂ©\n");
exit(EXIT_FAILURE);
}
}
for (size_t i = 22; i < 26; i++) {
/* afficher deux entrées de la table et
montrer qu’elles ne sont pas dans la table */
e.key = data[i];
ep = hsearch(e, FIND);
printf("%9.9s -> %9.9s:%d\n", e.key,
ep ? ep->key : "NULL", ep ? (int)(ep->data) : 0);
}
hdestroy();
exit(EXIT_SUCCESS);
}

VOIR AUSSI

bsearch (3), lsearch (3), malloc (3), tsearch (3)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr>, Grégoire Scano <gregoire.scano@malloc.fr> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .