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 :

probleme avec une table de hachage


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 20
    Points
    20
    Par défaut probleme avec une table de hachage
    bonjour à tout le monde.
    Description du programme : le but est de réaliser un programme qui permet de traduire des mots ou/et des phrases à partir d´un fichier dans une table de hachage
    Ce qui cloche, c´est la fonction sauverH qui permet d´extraire les mots en français et en anglais du fichier et de les sauver dans la table de hachage.
    Le problème est que quand je fait appel à cette fonction dans le main, tout au début pour bien que la table se charge, mon compilateur me donne un cadre tout en noir. Et si je la supprime ça va, le menu s'affiche pourtant je ne peux rien traduire à partir de la table car elle n´est pas encore remplie par la fonction sauverH.
    Alors si quelqu'un pouvait me trouver d'où viendrait l'erreur ? Avec tous mes respects pour tous les développeurs.

    Voici tout mon programme :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
     
    typedef struct traduction
    {
            char *fr;
            char *eng;
            }traduction;
    typedef struct table 
    {
            int nmax;
            int n;
            taduction ** element;
    }table;
     
    table * creertabe(int nmax)
    {
     
         table *tab=(table*)malloc(sizeof(table));
          tab->nmax=nmax;
          tab->n=0;
          tab->element=(traduction**)malloc(sizeof(traduction*)*nmax);
         // for(i=0;i<tab->nMax;i++)
         // tab->element[i]=NULL;
          return tab;
     
    }
     
     
    // déclaration de la fonction de hachage//
     int H (char* cle,int N)
     {
         int i,som=0;
         for(i=0;i<strlen(cle);i++)
         {
                                   som+=cle[i];
         }
       return som % N ; 
     }
     
     void sauverH(table *tab,char *f)
     {
          FILE *monfichier = fopen(f,"a+");
          int i=0;hr=1;h;
          char *F;char *A;
           while(!feof(myfile)) {
          h=H(F,tab->nmax);
          if (tab->element[h]=NULL) 
          {
                strcpy(tab->element[h]->fr,F);
                strcpy(tab->element[h]->eng,A);
                }
                else {
                     //resoudre probleme de collision
                     while (tab->element[hr]!=NULL && (i<tab->nmax) )
                     {
                           hr=(h+i)%tab->nmax;
                           i++;
                           }
                           if (tab->element[hr]=NULL)
                           {
                            strcpy(tab->element[hr]->fr,F);
                            strcpy(tab->element[hr]->eng,A);
                            }
                       }
     
                       }
                       fclose(monfichier);
                       }
     
     
     //insertion d´un nouveau mot 
    void insertable(table`*tab, char *f)
    {
         FILE *monfichier = open(f,"a+");
         int h,hr,i=0;
         char *F; char *A;
         printf("Donner le nouveu mot que vous voulez ajouté en francais");
         gets(F);
         h=H(F,tab->nmax);
         if(tab->element[h]=NULL) 
         {
                                  strcpy(tab->element[h]->fr,F);
                                  printf("Donner son equivalent en anglais");
                                  gets(A);
                                  strcpy(tab->element[h]->eng,A);
                                  fprintf(monfichier,"%s %s\n",tab->element[h]->fr,tab->element[h]->eng);
                                  }
                                  else {
                                       //resolution de probleme de collision
                                       while(tab->element[hr]!=NULL && i<tab->nmax)
                                       {
                                                                   hr=(h+i)*tab->nmax;
                                                                   i++;
                                                                   }
                                                                   if (tab->element[hr]=NULL)
                                                                   {
                                                                                             strcpy(tab->element[hr]->fr,F);
                                                                                             printf("Donnner son equivalent en anglais");
                                                                                             gets(A);
                                                                                             fprintf(monfichier," %s %s",tab->element[hr]->fr,tab->element[hr]->eng);
                                                                   }
                                                                   else {
                                                                        printf("Désolé le tableau est plein!!!!");
                                                                        }
         fclose(monfichier);
         }
         //traduction un mot
     
         void tradMot(table *tab,char *F)
    	{
    	 char* A;
    	 int x=1,i=1,hr=0,h;
     
    			   h=H(F,tab->nMax);
    			  if(tab->element[h]==NULL)
    				 {
    				 printf("ce mot n'existe pas dans ce petit dectionnaire\n");
    				  }
     
    			  else
    				{
    				   while((tab->element[hr]!=NULL)&&(i<tab->nMax))
    					  {
    					   if(strcmpi(tab->element[hr]->fr,F)==0)
    						 {
    							 puts(tab->element[hr]->eng);
    							 x=0;
    							 break;
    						  }
     
    						   hr=(h+i)%tab->nMax;
    						   i++;
    					   }
    						 if(x==1)
    						 printf("ce mot n'existe pas dans ce petit dectionnaire\n");
     
    					}
     
     
       }
     
     
     
     
     
     /*
    void charger (table *tab, char *f)
    {
         traduction *trd;
         while(! feof(f))
         {
                traduction *trd = new traduction();
                 fscanf(fichier,"%s %s ",trd->fr,trd->eng);  
                 insertable(tab,trd);
                 delete(trd);
         }
     }
     
    bool insertable(table *tab, traduction *trd)
     {
             if (table->n < table->nmax )
             {
                          table->element[table->n+1]=trd;
                          return   vrai;
             }
                          else return faux;
     }
     
    traduction* traduire (table *tab,traduction *trd, char[] *mot)
    {    
         int i=0; bool trouve=faux;
         while (i<tab->n && !trouve) 
         {
               trouve= comparer(tab->trd[i]->fr,mot);
               if (!trouve) i++;
         } 
           return trouve ? tab->trd[i]->eng : NULL
    }   
     
    int comparer(int x,int y)
    {
         if (x!==y) return 0;
         else return 1;
    }
    */
     
    void menu()
    {
         printf("0-FIN.\t\t");
         printf("1-Inserer dans la table.\n\n");
         printf("2-Traduire un mot.\n\n");
         print("3-Traduction d´une phrase.\n\n");
         print("Entrer votre choix");
    }
     
     
    void main()
    {
         table tab1 = creertabe(100);
         char* mot;
         int choix;
         sauverH(tabl,"hello.txt");
         clrscr();
         menu();
         choix=getch();
         do 
         {
            switch(choix)
                         {
                             case '0': exit(0); 
                                break();
     
                             case '1':  
                                        insertable(tab1,"hello.txt");
                                       printf("votre nouveau mot a été ajouté avec succés dans le dictionnaire!");
                                        getch();
                                        clrscr();
                                        menu();
                                        break;
     
     
                             case '2': 
                                       printf("Entrer le mot en francais que vous voulez traduire!");
                                       gets(mot);
                                       printf("son ‚quivalent en anglais est:\n");
                                       tradMot(tab1,"hello.txt");
                                       getch();
                                       clrscr();
                                       menu();
                                       break;
     
                             case '3':
                                      getch();
                                      clrscr();
                                      menu();
                                      break; 
     
     
     
                             default : 
                               printf("Vous avez pas sasie le bon numero dans le menu");
                               clrscr();
                                menu();
                     } while (1);
     
    }
    PS : en fait le fichier hello.txt c'est le fichier utilisé.


    Merci !!!!

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Quelques remarques préliminaires en commentaires :
    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
     void sauverH(table *tab,char *f)
     {
          FILE *monfichier = fopen(f,"a+");
          int i=0;hr=1;h;
          char *F;char *A;
           while(!feof(myfile)) {  
    // feof ne s'utilise pas de cette façon
          h=H(F,tab->nmax);
          if (tab->element[h]=NULL)
    // Ce n'est pas = mais == pour la comparaison.
    // encore faut-il que ce tableau ait été initialisé par des NULL
          {
                strcpy(tab->element[h]->fr,F);
                strcpy(tab->element[h]->eng,A);
    // Qui a mis quelque chose dans F et A ?
    // Qui a alloué de la la place en tab->element[h]->fr et tab->element[h]->eng
    // pour pouvoir y copier une chaîne de caractères ?
                }
    ...
    }
    // Aucune lecture du fichier dans cette fonction !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    j"ai résolu quelque commentaires que tu as posé, en revanche ca marche pas, toujours une console noir.
    en fait pour le feof je crois qu'il est correct non?
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void sauverH(table *tab,char *f)
     {
          FILE *monfichier = fopen(f,"a+");
          int i=1,hr=0,h;
     
           while(!feof(monfichier)) {
     
            char* F=new char[20];
            char* A=new char[20];
          h=H(F,tab->nmax);
          if (tab->element[h]==NULL)
          {
              tab->element[h] = new traduction;
                strcpy(tab->element[h]->fr,F);
                strcpy(tab->element[h]->eng,A);
                free(A);
                free(F);
                (tab->n)++;
                }
                else {
                     //resoudre probleme de collision
                     while ((tab->element[hr]!=NULL) && (i<tab->nmax) )
    		 {
                            tab->element[hr] = new traduction;
                           hr=(h+i)%(tab->nmax);
                           i++;
                           }
    		       if (tab->element[hr]==NULL)
                           {
                            strcpy(tab->element[hr]->fr,F);
                            strcpy(tab->element[hr]->eng,A);
                            (tab->n)++;
                            free(A);
                            free(F);
                            }
                       }
     
                       }
                       fclose(monfichier);
    		   }

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    1. Ben non, il n'est pas correct. La valeur de retour de feof() est indéfinie tant qu'une fonction de lecture n'a pas retourné une valeur d'erreur. Et si cette "erreur" est autre chose que la fin du fichier, feof() retourne zéro.
    2. Tu ne testes pas le résultat de fopen().
    3. new, c'est du C++, pas du C.
    4. Cela montre que tu compiles en C++. Renomme ton fichier en .c, et change tes options de compilation si nécessaire. Ajoute ceci au début de ton code pour être sûr:
      Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      #ifdef __cplusplus
      #error Tentative de compiler un code C avec un compilo C++
      #endif
    5. F et A pointent vers des buffers de caractères non-initialisés. Il peut y avoir n'importe quoi au bout, et certainement pas ce que tu cherches.
    6. De plus, cela causera sûrement un dépassement de tableau dans strcpy, si tu as de la chance.
    7. Tu as beaucoup de variables au nom d'un seul caractère.
    8. C'est mal indenté.

    PS: Écris en Français, s'il te plait. Tu ne tapes pas avec un téléphone portable, que je sache.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 20
    Points
    20
    Par défaut Merci a tous
    voila avant un jour de rendement de ce Travaux pratiques, sur les tables de Hachage,j´ai enfin résolu mon problème et cela c´est grâce a vous.Merci

    voila la nouvelle fonctions saverH:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    void sauverH(table *tab,char *f)
     {
          FILE *monfichier = fopen(f,"a+");
          int i=1,hr=0,h;
     
           while(!feof(monfichier)) {
     
            char* F=new char[20];
            char* A=new char[20];
             fscanf(monfichier,"%s %s",F,A);
          h=H(F,tab->nmax);
          if (tab->element[h]==NULL)
          {
              tab->element[h] = new traduction;
                strcpy(tab->element[h]->fr,F);
                strcpy(tab->element[h]->eng,A);
                free(A);
                free(F);
                (tab->n)++;
                }
                else {
                     //resoudre probleme de collision
                     while ((tab->element[hr]!=NULL) && (i<tab->nmax) )
    		 {
                            tab->element[hr] = new traduction;
                           hr=(h+i)%(tab->nmax);
                           i++;
                           }
    		       if (tab->element[hr]==NULL)
                           {
                            strcpy(tab->element[hr]->fr,F);
                            strcpy(tab->element[hr]->eng,A);
                            (tab->n)++;
                            free(A);
                            free(F);
                            }
                       }
     
                       }
                       fclose(monfichier);
    		   }

    le problème que j´ai oubliée d´allouer l´espace mémoire pour le nouveau élément hr (tab->element[hr] = new traduction)
    voila le programme se compile bien. Merci a vous
    en fait,il s´agit de l´une de mes premiers discussion sur ce forum, alors je suis désolé du fait que j´ai pas bien lit que faire avant de poster un message.
    c´est grâce a votre critique, qu´on se développe

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void sauverH(table *tab,char *f)
    f devrait être const

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          FILE *monfichier = fopen(f,"a+");
           while(!feof(monfichier)) {
    On t'a déjà dit que feof() ne s'mploie pas ainsi, et que tu as encore oublié de tester le retour de fopen().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            char* F=new char[20];
            char* A=new char[20];
    Et tu te crois toujours en C++...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              tab->element[h] = new traduction;
    Attends, cette fonction, elle est supposée s'appeler sauver ou charger?

    Ah, ça, c'est très mauvais, aussi bien en C qu'en C++. SOIT tu fais new+delete, SOIT tu fais malloc()+free(), mais pas... ça!

    Hé, tu indentes en K&R ou en BSD? Faut choisir un mode, pas ce truc hybride!

    PS: D'ailleurs, tu n'as même pas besoin d'allouer dynamiquement tes buffers A et F, vu que tu ne t'en sers que dans la fonction elle-même, et que tu fais un strcpy() pour en copier le contenu dans ta table de hachage...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void sauverH(table *tab,char *f)
    f devrait être const

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          FILE *monfichier = fopen(f,"a+");
           while(!feof(monfichier)) {
    On t'a déjà dit que feof() ne s'mploie pas ainsi, et que tu as encore oublié de tester le retour de fopen().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            char* F=new char[20];
            char* A=new char[20];
    Et tu te crois toujours en C++...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              tab->element[h] = new traduction;
    Attends, cette fonction, elle est supposée s'appeler sauver ou charger?

    Ah, ça, c'est très mauvais, aussi bien en C qu'en C++. SOIT tu fais new+delete, SOIT tu fais malloc()+free(), mais pas... ça!

    Hé, tu indentes en K&R ou en BSD? Faut choisir un mode, pas ce truc hybride!

    PS: D'ailleurs, tu n'as même pas besoin d'allouer dynamiquement tes buffers A et F, vu que tu ne t'en sers que dans la fonction elle-même, et que tu fais un strcpy() pour en copier le contenu dans ta table de hachage...
    ce programme a été sauvés sous traduction.cpp , donc il est possible de faire un code en c++ ici, pour new, et delete , je suis d´accords avec toi de mieux utiliser un delete avec un new mais Code::Blocs accepte ca, et la partie de l´allocation de la mémoire pour les buffers A et F a été ajouté pour rien.
    Merci pour vos remarques

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. indexation d'un tableau avec une table de hachage
    Par mamax29 dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2011, 09h23
  2. probleme sur un appli partagée avec une table liée
    Par t8024328 dans le forum Sécurité
    Réponses: 2
    Dernier message: 18/09/2007, 11h42
  3. Probleme avec une balise Table
    Par Aspic dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 22/08/2007, 21h30
  4. PROBLEME AVEC UNE TABLE INTERBASE
    Par barro dans le forum InterBase
    Réponses: 1
    Dernier message: 22/09/2004, 08h16
  5. Probleme avec une table vide
    Par king dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/03/2004, 14h24

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