Changes between Version 70 and Version 71 of CaoCourseTme2


Ignore:
Timestamp:
Feb 18, 2007, 8:38:02 PM (18 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme2

    v70 v71  
    7373= Etape 1 : Questions sur le code fourni =
    7474
    75 == a) Le Makefile ==
     75== A) Le Makefile ==
    7676
    7777Les premières questions portent sur le fichier attachment:"Makefile"
    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
     79Completez 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 ==
    9291
    9392Les questions suivantes portent sur le programme principal attachment:main.c 
    9493Ce fichier contient la fonction main() et la fonction getarg() qui effectue l'analyse de la ligne de commande.
    9594
    96  * Expliquez à quoi sert chacun des fichiers inclus au début du fichier ''main.c''
    97  * A quoi sert le fichier ''main.h'' ?
    98  * Expliquez le fonctionnement de la fonction getopt() ({{{man 3 getopt}}})[[BR]]
     95 * '''QB1''' Expliquez à quoi sert chacun des fichiers inclus au début du fichier ''main.c''
     96 * '''QB2''' A quoi sert le fichier ''main.h'' ?
     97 * '''QB3''' Expliquez le fonctionnement de la fonction getopt() ({{{man 3 getopt}}})[[BR]]
    9998    Vous ajouterez plus tard dans la fonction getarg() l'option -s qui demande de fournir des statistiques concernant l'utilisation de la tables de hachage.
    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 ?
    106105
    107106Questions sur le fichier de prototype associé attachment:main.h
     
    110109 *  Pourquoi inclure {{{stdio.h}}} ici ?
    111110
    112 == c) La table de hachage générique ==
     111== C) La table de hachage générique ==
    113112
    114113Le fichier attachment: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:
     
    116115[[Image(Diapositive1.jpg, 100px)]]
    117116
    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 ?
    120119 
    121120questions sur le fichier attachment:hte.c
    122121
    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 ==
    128127
    129128Le fichier attachment:dico.c rassemble les fonctions d'accès à une table de hachage utilisée comme 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 ==
    137137
    138138Le fichier attachment:count.c contient le code de la fonction count(), qui compte le nombre d'occurences des différents mots présents dans le fichier texte analysé. Il contient également la fonction auxiliaire token() qui lit le fichier texte mot par mot,
    139139et la fonction result_count() qui affiche les résultats.
    140140
    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 ==
    148148
    149149Vous trouverez deux autres services possibles utilisant des tables de hachage