32 | | * {{{count.c, count.h ...............}}} algorithme de parcours d'un fichier texte en vue de comptage. |
33 | | * {{{hte.c, hte.h ...................}}} fonction de création des tables de hachage et déclaration de toutes fonctions de gestion. |
34 | | * {{{dico.c, dejavu.c, namealloc.c ..}}} fonctions de gestion des tables pour trois types d'usage |
| 32 | * {{{count.c, count.h ...............}}} analyseur lexical et fonctions de comptage et d'affichage du résultat. |
| 33 | * {{{dico.c, dico.h..................}}} fonctions de gestion de la table de hachage. |
| 34 | * {{{hash.c, hash.h..................}}} fonction générale de calcul de l'index à partir de la clé de hachage. |
109 | | Questions sur le fichier de prototype associé [attachment:main.h main.h] |
110 | | |
111 | | * '''QB10''' A quoi servent les 2 premières lignes du fichier ''main.h'' et la dernière ? |
112 | | * '''QB11''' Pourquoi inclure {{{stdio.h}}} ici ? |
113 | | |
114 | | == C) La table de hachage générique == |
115 | | |
116 | | Le fichier [attachment:hte.h hte.h] contient les déclarations des fonctions de base et des types de données permettant de manipuler une table de hachage générique possédant la structure décrite ci-dessous: |
117 | | |
118 | | * '''QC1''' Les types {{{hte_item_t}}} et {{{hte_data_t}}} sont des structures dont le contenu n'est pas défini dans les fichiers ''hte.h'' ou ''hte.c''. En effet, la table de hachage définie dans ces fichiers est une ressource "générique", qui peut être utilisées pour stocker différents types d'objets. Comme les 3 fichiers ''dico.c'', ''dejavu.c'' et ''namealloc.c'' définissent trois utilisations différentes de cette table de hachage, ils doivent redéfinir les types des objets stockés. Quelle est la contrainte d'usage de ces types dans le fichier ''hte.c'' ? |
119 | | * '''QC2''' Dans la définition des prototypes de fonctions, le nom des paramètre est-il nécessaire ? si non pourquoi les mettre ? |
| 107 | |
| 108 | |
| 109 | |
121 | | questions sur le fichier [attachment:hte.c hte.c] |
122 | | |
123 | | * '''QC3''' Quel est l'encombrement (en nombre d'octets) des structures créées en mémoire par la fonction hte_create(nb_item) , quand nb_item=10 ? Quelle différence y-at-il entre les appels système malloc() et calloc() ? |
124 | | * '''QC4''' La fonction hte_hash() peut-elle provoquer une erreur de segmentation ? Comment y remèdier proprement ? |
125 | | * '''QC5''' Dans la fonction hte_create() comment fait-on pour tester le retour de l'appel système malloc() ? à quoi celà sert-il ? |
126 | | |
127 | | == D) Le dictionnaire == |
128 | | |
129 | | Le fichier [attachment:dico.c dico.c] rassemble les fonctions d'accès à une table de hachage utilisée comme dictionnaire. |
130 | | * '''QD1''' Pourquoi la structure de donnée {{{hte_item_s}}} a-t-elle un encombrement mémoire variable ? |
131 | | * '''QD2''' On aurait pu utiliser une structure de donnée de taille fixe en définissant le troisième champs de la structure comme un pointeur sur chaîne de caractères du type {{{char *KEY}}}. Pour quoi n'a-t-on pas utilisé cette technique ? |
132 | | * '''QD3''' Quelle est la technique utilisée dans la fonction hte_add() pour créer ce type d'objet de taille variable en mémoire ? |
133 | | * '''QD4''' La structure de donnée {{{hte_data_s}}} n'est pas définie dans le fichier ''dico.c''. Pourquoi ? Où devra-t-il être défini ? quel genre d'information devra-t-elle contenir ? |
134 | | * '''QD5''' Que font les fonctions hte_get() et hte_add() ? |
135 | | * '''QD5''' Pourquoi teste-on la valeur de l'argument ''key'' dans les deux fonctions hte_get() et hte_add() ? |
136 | | * '''QD6''' Que fait la fonction perror() ? |
137 | | |
138 | | == E) La fonction de comptage des mots == |
| 111 | |
| 112 | == C) Le dictionnaire == |
| 113 | |
| 114 | Les fichier [attachment:dico.c dico.c] et [attachement:dico.h dico.h] rassemblent les fonctions d'accès à une table de hachage utilisée comme dictionnaire. |
| 115 | * '''QC1''' Quel est l'encombrement (en nombre d'octets) des structures créées en mémoire par la fonction dico_create(nb_item) , quand nb_item=10 ? Quelle différence y-at-il entre les appels système malloc() et calloc() ? |
| 116 | * '''QC2''' Pourquoi la structure de donnée {{{dico_item_s}}} a-t-elle un encombrement mémoire variable ? On aurait pu utiliser une structure de donnée de taille fixe en définissant le troisième champs de la structure comme un pointeur sur chaîne de caractères du type {{{char *KEY}}}. Pour quoi n'a-t-on pas utilisé cette technique ? |
| 117 | * '''QC3''' Quelle est la seule fonction capable d'introduire un nouvel item dans le dictionnaire? Quelle est la technique utilisée dans la fonction dico_get() pour créer ce type d'objet de taille variable en mémoire ? |
| 118 | * '''QC4''' Dans la fonction dico_get() comment fait-on pour tester le retour de l'appel système malloc() ? à quoi celà sert-il ? Pourquoi teste-on la valeur de l'argument ''key'' au début de cette fonction ? Que fait la fonction perror() ? |
| 119 | * '''QC5''' La fonction hashindex() peut-elle provoquer une erreur de segmentation ? Comment y remèdier proprement ? |
| 120 | |
| 121 | == D) La fonction de comptage des mots == |
143 | | * '''QE1''' Le mot clé ''static'' est utilisé de deux manières différentes dans le fichier ''count.c'' (à l'intérieur et à l'extérieur d'une fonction). Précisez sa signification pour chacune des deux utilisations. |
144 | | * '''QE2''' Dans la fonction token(), pourquoi ne peut-on pas utiliser l'appel système malloc() pour allouer la mémoire correspondant au tableau ''buffer'' ? |
145 | | * '''QE3''' La fonction token() doit renvoyer un nouveau "token" (mot) du fichier texte analysé, ainsi que le numéro de ligne, chaque fois qu'elle est appelée. Elle utilise les fonctions fgets() et strtok(). Que font ces deux fonctions ? |
146 | | * '''QE4''' Pourquoi as-ton mis une étoile devant l'argument ''numero'' de la fonction token() ? |
147 | | * '''QE5''' La fonction result_count() utilise-t-elle des fonctions d'accès spécifiques pour effectuer le parcours des éléments présents dans la table de hachage ? Quelles sont ces fonctions d'accès et que font-elles ? Dans quel fichier sont-elles définies? Dans quel ordre vont être affichés les élément de la table ? |
148 | | |
149 | | == F) Autres services utiles == |
150 | | |
151 | | Vous trouverez deux autres services possibles utilisant des tables de hachage |
152 | | dans les fichiers [attachment:dejavu.c dejavu.c] et [attachment:namealloc.c namealloc.c]. |
153 | | Ces services ne sont pas utilisés dans ce TME2, mais ils vous seront utiles lors des TME futurs. |
154 | | Vous pourrez faire alors une édition de liens avec la bibliothèque libhte.a. |
155 | | |
156 | | La fonction dejavu() permet de répondre à la question "ai-je déjà vu cette chaine de caractères". |
157 | | La fonction namealloc() est très utilisée dans la chaîne de CAO Alliance, |
158 | | et permet de garantir que si deux chaines de caractères sont identiques |
159 | | alors elles seront rangées à la même adresse. |
| 126 | * '''QD1''' Le mot clé ''static'' est utilisé de deux manières différentes dans le fichier ''count.c'' (à l'intérieur et à l'extérieur d'une fonction). Précisez sa signification pour chacune des deux utilisations. |
| 127 | * '''QD2''' Dans la fonction token(), pourquoi ne peut-on pas utiliser l'appel système malloc() pour allouer la mémoire correspondant au tableau ''buffer'' ? |
| 128 | * '''QD3''' La fonction token() doit renvoyer un nouveau "token" (mot) du fichier texte analysé, ainsi que le numéro de ligne, chaque fois qu'elle est appelée. Elle utilise les fonctions fgets() et strtok(). Que font ces deux fonctions ? |
| 129 | * '''QD4''' Pourquoi as-ton mis une étoile devant l'argument ''numero'' de la fonction token() ? |
| 130 | * '''QD5''' La fonction result_count() utilise-t-elle des fonctions d'accès spécifiques pour effectuer le parcours des éléments présents dans la table de hachage ? Quelles sont ces fonctions d'accès et que font-elles ? Dans quel fichier sont-elles définies? Dans quel ordre vont être affichés les élément de la table ? |