IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Hashmap POSIX <hsearch.h>


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Echyzen
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 123
    Par défaut Hashmap POSIX <hsearch.h>
    Salut tout le monde,

    J'ai une question assez spécifique je suis pas sûr que l'on puisse m'aider mais je tente quand même alors voilà j'utilise les hashmap proposé par POSIX fichier <search.h>.

    Le problème c'est qu'au bout d'un moment et pourtant je n'ai qu'une centaine de mot il remet le compteur à zéro sans que je comprenne pourquoi c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    /* ajoute word dans la table */
    void hash_table_add(char *word) {
    		e.key = word;
     
    		/*
    		* Test si le mot n'est pas dans notre HashTable
    		* auquel cas on le rajoute
    		*/
    		if((ep = hsearch(e, FIND)) == NULL) {
    			/* e.data est un int
    			* permet d'associer la key de manière unique
    			*/
    			printf("%s\n",e.key);
    			e.data = (void *) 1;
    			ep = hsearch(e, ENTER);
    			/* there should be no failures */
    			if (ep == NULL) {
    				fprintf(stderr, "entry failed\n");
    				exit(EXIT_FAILURE);
    			}
    		} else { // sinon on incrémente son data de 1
    			ep = hsearch(e, FIND);
    			/*int data = (int) ep->data + 1;
    			ep->data = (void*) data;*/
    			ep->data += 1;
    			hsearch(*ep,ENTER);			
    		}
     
     
    }
    J'appelle ma fonction est moment il va plus trouver un mot qui est pourtant bien dans la table et il va donc réinitialisé le compteur...

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je ne connais pas ce module, mais cette ligne m'étonne :
    Ton objectif est de copier la chaine ?
    Si oui, ce n'est pas la bonne méthode, il faut utiliser strcpy().
    Si non, comment t'assures-tu de la pérennité du "lien" ?

  3. #3
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Peut être pas un strcpy, mais un strdup... enfin à tester !

    http://pubs.opengroup.org/onlinepubs.../search.h.html

    Mais d'après l'OpenGroup, le key est bien un char*...
    Il faudrait juste savoir où est défini "e", ce qu'est "ep", etc...
    Peut être un effet de bord ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Membre confirmé Avatar de Echyzen
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 123
    Par défaut
    Effectivement, j'ai omis des informations alors je mets ce qui est demandé :

    ENTRY e, *ep;

    Ceci est au dessus en début de fichier (étant issus du C++ j'appelle ceci le namespace anonyme). J'ai mis un strcpy à la place et j'ai toujours le même problème peut être faut il que je fasse un malloc mais je ne sais comment m'y prendre...

    Je suis vraiment perdu là...

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Quand on est vraiment perdu, on s'arrête et on lit une carte.

    En C, la carte, ce sont les pages de manuel --> http://linux.die.net/man/3/hsearch On y lit :
    The argument item is of type ENTRY, which is defined in <search.h> as follows:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct entry {
        char *key;
        void *data;
    } ENTRY;
    En faisant donc e.key = word;, tu fais juste l'association de pointeurs. Mais si la zone pointée par word devient invalide (parce qu'on appelle free() ou passe que c'est un tableau automatique), alors ton entrée permet sa clé. Je ne sais pas comment tu l'utilises cette entrée, mais il faut voir si ça a une importance. Si tu l'ajoutes à la map, je pense que oui.

    Ceci est au dessus en début de fichier (étant issus du C++ j'appelle ceci le namespace anonyme).
    Tu n'ignores sans doute pas qu'il n'y a pas de notion de namespace en C, juste des notions de portée. Si ta variable ne possède pas le modification static, alors elle est globale à tout le programme.

    J'ai mis un strcpy à la place et j'ai toujours le même problème peut être faut il que je fasse un malloc mais je ne sais comment m'y prendre...
    Tu ne sais pas comment t'y prendre pour faire un malloc() ?
    Doit-on ou ne doit-on pas faire un malloc() avant de faire un strcpy() ? Hum.... La définition de la structure réserve t-elle un espace pour pouvoir y stocker quoi que ce soit ? Que penses-tu du code suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *p;
    strcpy(p, "bonjour");
    @Metalman : je n'ai pas parlé de strdup() car ce n'est pas une fonction standard. Et après, j'ai réalisé que c'est une fonction POSIX, ce qui n'est pas vraiment un problème quand on travaille avec des hash maps POSIX

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    @Bk : strdup()... si je l'utilise... c'est vraiment parce qu'elle m'a été TRES utile pour debugger/pour me faciliter la vie... mais que c'est bien chiant de toujours se prendre un "undefined strdup" avec le flag ansi !
    Bref la zone floue de ANSI/POSIX avec strdup est quasiment inévitable à chaque fois.

    @Echyzen : Etrange que tu ais autant de difficultés avec malloc/free....
    Parce que c'est quasiment la même chose que new/delete lors de l'utilisation avec les types.
    Tu en as déjà fait, non ? Les pointeurs toossa ça te dit quelquechose, non ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

Discussions similaires

  1. Ranger un tableau de String dans ma HashMap
    Par jeyce dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 26/08/2004, 22h41
  2. [HashMap] Modification d'objet d'une Hashtable
    Par viena dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 29/07/2004, 09h04
  3. Surcharge de l'égalité et HashMap
    Par olivierM dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 10/06/2004, 09h54
  4. [débutant] cherche a copier une HashMap
    Par mathieublanc13 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 09/05/2004, 14h33
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo