78 | | |
79 | | 1. Completez la liste des dépendances pour les cibles : {{{main.o ... namealloc.o}}}. |
80 | | 1. Réécrivez les commandes en utilisant les variables automatiques : {{{$@ $< $^}}} |
81 | | * {{{$@}}} : désigne le fichier cible d'une règle. |
82 | | * {{{$<}}} : désigne le premier fichier de la liste des fichiers source d'une règle. |
83 | | * {{{$^}}} : désigne la liste des fichiers source d'une règle. |
84 | | 1. Pourquoi est-il préférable de regrouper la definition des commandes et paramètres au début du Makefile? |
85 | | 1. A quoi servent les options -p, -g, -wall, -werror, -ansi ? (man gcc) |
86 | | 1. Comment demander l'optimisation maximale du compilateur ? (man gcc) |
87 | | 1. L'option -p est présente dans LDFLAGS et CFLAGS, pourquoi n'est-ce pas le cas de -g ? (man gcc) |
88 | | 1. Que fait la regle indent ? quelle est la signification des flags utilisés par le programme indent ? |
89 | | (man indent) |
90 | | |
91 | | == b) Le programme main == |
| 78 | |
| 79 | Completez la liste des dépendances pour les cibles : {{{main.o ... namealloc.o}}}, puis re-écrivez les commandes en utilisant les variables automatiques : {{{$@ $< $^}}} [[BR]] |
| 80 | - {{{$@}}} : désigne le fichier cible d'une règle.[[BR]] |
| 81 | - {{{$<}}} : désigne le premier fichier de la liste des fichiers source d'une règle.[[BR]] |
| 82 | - {{{$^}}} : désigne la liste des fichiers source d'une règle.[[BR]] |
| 83 | |
| 84 | * '''QA1''' Pourquoi est-il préférable de regrouper la definition des commandes et paramètres au début du Makefile? |
| 85 | * '''QA2''' A quoi servent les options -p, -g, -wall, -werror, -ansi ? (man gcc) |
| 86 | * '''QA3''' Comment demander l'optimisation maximale du compilateur ? (man gcc) |
| 87 | * '''QA4''' L'option -p est présente dans LDFLAGS et CFLAGS, pourquoi n'est-ce pas le cas de -g ? (man gcc) |
| 88 | * '''QA5''' Que fait la regle indent ? quelle est la signification des flags utilisés par le programme indent ? (man indent) |
| 89 | |
| 90 | == B) Le programme main == |
100 | | * A quoi sert l'appel ''return'' a la fin de la fonction main() ? |
101 | | * A quoi sert l'appel système ''exit'' à la fin de la fonction usage() ? |
102 | | * Quels sont les appels systeme utilisés dans ce fichier main.c ? |
103 | | * Quelle precaution doit on prendre lors de leur utilisation ? |
104 | | * Ou sont definies les fonctions standard de la bibliothèque C ? |
105 | | * Qu'est-ce qu'un filtre unix ? Que faut-il faire pour transformer ce programme en filtre ? |
| 99 | * '''QB4''' A quoi sert l'appel ''return'' a la fin de la fonction main() ? |
| 100 | * '''QB5''' A quoi sert l'appel système ''exit'' à la fin de la fonction usage() ? |
| 101 | * '''QB6''' Quels sont les appels systeme utilisés dans ce fichier main.c ? |
| 102 | * '''QB7''' Quelle precaution doit on prendre lors de leur utilisation ? |
| 103 | * '''QB8''' Ou sont definies les fonctions standard de la bibliothèque C ? |
| 104 | * '''QB9''' Qu'est-ce qu'un filtre unix ? Que faut-il faire pour transformer ce programme en filtre ? |
118 | | * 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. Par conséquent les types {{{hte_item_t}}} et {{{hte_data_t}}} peuvent (et doivent) être définis en fonction de l'utilisation qu'on souhaite. Les 3 fichiers ''dico.c'', ''dejavu.c'' et ''namealloc.c'' définissent trois utilisations différentes d'une table de hachage. Quelle est la contrainte d'usage de ces types dans le fichier ''hte.c'' ? |
119 | | * Dans la définition des prototypes de fonctions, le nom des paramètre est-il nécessaire ? si non pourquoi les mettre ? |
| 117 | * '''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. Par conséquent les types {{{hte_item_t}}} et {{{hte_data_t}}} peuvent (et doivent) être définis en fonction de l'utilisation qu'on souhaite. Les 3 fichiers ''dico.c'', ''dejavu.c'' et ''namealloc.c'' définissent trois utilisations différentes d'une table de hachage. Quelle est la contrainte d'usage de ces types dans le fichier ''hte.c'' ? |
| 118 | * '''QC2''' Dans la définition des prototypes de fonctions, le nom des paramètre est-il nécessaire ? si non pourquoi les mettre ? |
123 | | * Quel est l'encombrement mémoire (en nombre d'octets) de la structure {{{root}}} créée par la fonction hte_create() , quand {{{nb_list==10}}}. |
124 | | * La fonction hte_hash() peut-elle provoquer une erreur de segmentation ? Comment y remedier proprement ? |
125 | | * 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 == |
| 122 | * '''QC3''' Quel est l'encombrement mémoire (en nombre d'octets) de la structure {{{root}}} créée par la fonction hte_create() , quand {{{nb_list==10}}}. |
| 123 | * '''QC4''' La fonction hte_hash() peut-elle provoquer une erreur de segmentation ? Comment y remèdier proprement ? |
| 124 | * '''QC5''' Dans la fonction hte_create() comment fait-on pour tester le retour de l'appel système malloc() ? à quoi celà sert-il ? |
| 125 | |
| 126 | == D) Le dictionnaire == |
130 | | * Pourquoi la structure de donnée {{{hte_item_s}}} a-t-elle un encombrement mémoire variable ? |
131 | | * 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 | | * 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 | | * 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 | | * Pourquoi teste-on la valeur de l'argument ''key'' dans la fonction hte_get() ? A quoi sert la fonction perror() ? |
135 | | |
136 | | == e) La fonction de comptage des mots == |
| 129 | * '''QD1''' Pourquoi la structure de donnée {{{hte_item_s}}} a-t-elle un encombrement mémoire variable ? |
| 130 | * '''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 ? |
| 131 | * '''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 ? |
| 132 | * '''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 ? |
| 133 | * '''QD5''' Pourquoi teste-on la valeur de l'argument ''key'' dans la fonction hte_get() ? |
| 134 | * '''QD6'' Que fait la fonction perror() ? |
| 135 | |
| 136 | == E) La fonction de comptage des mots == |
141 | | * Le mot clé '''static''' est utilisé de trois manières différentes dans le fichier ''count.c''. Précisez sa signification pour chacune des trois utilisations. |
142 | | * Dans la fonction token(), pourquoi ne peut-on pas utiliser l'appel système malloc() pour allouer la mémoire correspondant au tableau ''buffer'', en écrivant par exemple {{{char * buffer = malloc(1024);}}} ? |
143 | | * 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 ? |
144 | | * Pourquoi as-ton mis une étoile devant l'argument ''numero'' de la fonction token() ? |
145 | | * Pourquoi 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 ? Dans quel ordre vont être affichés les élément de la table ? |
146 | | |
147 | | == f) Autres services utiles == |
| 141 | * '''QE1''' Le mot clé '''static''' est utilisé de trois manières différentes dans le fichier ''count.c''. Précisez sa signification pour chacune des trois utilisations. |
| 142 | * '''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'', en écrivant par exemple {{{char * buffer = malloc(1024);}}} ? |
| 143 | * '''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 ? |
| 144 | * '''QE4''' Pourquoi as-ton mis une étoile devant l'argument ''numero'' de la fonction token() ? |
| 145 | * '''QE5''' Pourquoi 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 ? Dans quel ordre vont être affichés les élément de la table ? |
| 146 | |
| 147 | == F) Autres services utiles == |