Changes between Version 13 and Version 14 of CaoCourseTme2


Ignore:
Timestamp:
Feb 16, 2007, 5:24:23 PM (18 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CaoCourseTme2

    v13 v14  
    119119== le programme principal : main ==
    120120
    121  *  A quoi servent les lignes 1, 2 et 11 ?
     121'''Fichier main.h'''
     122
     123 *  A quoi servent les lignes les 2 premières lignes et la dernière ?
    122124 *  Pourquoi inclure {{{stdio.h}}} ici ?
    123125
    124 '''Fichier main.h'''
    125126{{{
    126127#ifndef _MAIN_H_
     
    140141}}}
    141142
    142  1. A quoi sert chaque include ?
    143  1. Pourquoi a-t-on un fichier main.h ?
    144  1. Expliquez le fonctionnement de la fonction getopt ({{{man 3 getopt}}})[[BR]]
     143'''Fichier main.c'''
     144
     145 *  A quoi sert chaque include ?
     146 *  Pourquoi a-t-on un fichier main.h ?
     147 *  Expliquez le fonctionnement de la fonction getopt ({{{man 3 getopt}}})[[BR]]
    145148    Ajoutez l'option -h qui affiche l'usage du programme et un petit texte de description du comportement (très court, c'est juste pour l'exercice).[[BR]]
    146149    Vous ajouterez plus tard l'option -s qui demande les statistiques d'usage de la tables de hachage.
    147  1. A quoi sert l'appel de return a la fin de la fonction main() ?
    148  1. Pourquoi y-a-t-il exit() a la fin de la fonction usage() ?
    149  1. Qu'est ce qu'un appel systeme, en voyez-vous dans ce fichier, si oui lesquels,
    150     citez en d'autres,
    151  1. Quelle precaution doit on prendre lors de leur utilisation ?
    152  1. Ou sont definiies les fonctions standards ?
    153  1. Qu'est-ce qu'un filtre unix ?
    154  1. Que faut-il faire pour transformer ce programme en filtre ?
    155 
    156 '''Fichier main.c'''
     150 *  A quoi sert l'appel de return a la fin de la fonction main() ?
     151 *  Pourquoi y-a-t-il exit() a la fin de la fonction usage() ?
     152 *  Qu'est ce qu'un appel systeme, en voyez-vous dans ce fichier, si oui lesquels,
     153    citez en d'autres.
     154 *  Quelle precaution doit on prendre lors de leur utilisation ?
     155 *  Ou sont definiies les fonctions standards ?
     156 *  Qu'est-ce qu'un filtre unix ?
     157 *  Que faut-il faire pour transformer ce programme en filtre ?
     158
    157159{{{
    158160include <stdlib.h>
     
    242244== Les fonctions de bases de la tables de hachage ==
    243245
    244  1. Les types {{{hte_item_t}}} et {{{hte_data_t}}} sont des structures dont le contenu n'est pas défini ici.
     246'''Fichier hte.h'''
     247
     248 *  Les types {{{hte_item_t}}} et {{{hte_data_t}}} sont des structures dont le contenu n'est pas défini ici.
    245249    Leur contenu n'est pas défini non plus dans le fichier {{{hte.c}}}, en revanche il est défini dans les fichiers {{{dico.c}}}, {{{dejavu.c}}} et {{{namealloc.c}}}
    246250    Quelle est alors la contrainte d'usage de ces types dans le fichier {{{hte.c}}} ?
    247251    Quel est l'intérêt de cette écriture ?
    248  1. Dans la définition des prototypes de fonctions, le nom des paramètre est-il nécessaire ? si non pour les mettre ?
    249  
    250 '''Fichier hte.h'''
     252 *  Dans la définition des prototypes de fonctions, le nom des paramètre est-il nécessaire ? si non pour les mettre ?
     253 
    251254{{{
    252255#ifndef _HTE_H_
     
    358361'''Fichier hte.c'''
    359362
    360  1. Faîte un dessin représentatif de la valeur de la variable locale {{{root}}} de la fonction {{{hte_create}}} si {{{nb_list==10}}} juste avant l'appel return.
    361  1. La fonction {{{hte_hash}}} peut-elle provoquer une erreur de segment ? Comment y remedier proprement ?
    362  1. Dans la fonction {{{hte_create}}} comment fait-on pour tester le retour de {{{malloc}}} ? à quoi celà sert-il ?
     363 * Faîte un dessin représentatif de la valeur de la variable locale {{{root}}} de la fonction {{{hte_create}}} si {{{nb_list==10}}} juste avant l'appel return.
     364 * La fonction {{{hte_hash}}} peut-elle provoquer une erreur de segment ? Comment y remedier proprement ?
     365 * Dans la fonction {{{hte_create}}} comment fait-on pour tester le retour de {{{malloc}}} ? à quoi celà sert-il ?
    363366
    364367{{{
     
    421424== Le service ''dejavu'' ==
    422425
    423  1. Pourquoi définit on la structure {{{hte_item_s}}} ici ?
    424  1. La variable {{{root_namealloc}}} est static. Qu'est-ce que cela veut dire ?
    425  1. Donner les autres usages du mots clé static en langage C.
    426  1. A quoi sert la fonction {{{perror}}} ?
     426 * Pourquoi définit on la structure {{{hte_item_s}}} ici ?
     427 * La variable {{{root_namealloc}}} est static. Qu'est-ce que cela veut dire ?
     428 * Donner les autres usages du mots clé static en langage C.
     429 * A quoi sert la fonction {{{perror}}} ?
    427430
    428431'''Fichier dejavu.c'''
     
    570573}
    571574}}}
    572 
    573 == Le service allocateur de nom ==
    574 
    575 '''Fichier namealloc.c'''
    576 {{{
    577 #include "hte.h"
    578 #include <stdio.h>
    579 #include <string.h>
    580 #include <stdlib.h>
    581 }}}
    582 {{{
    583 /*
    584  * structure définissant un item du dictionnaire
    585  * Un item est formé d'un couple (clé,valeur) plus un pointeur
    586  * permettant de chainer les items ayant le meme index de hachage
    587  */
    588 struct hte_item_s
    589 {
    590     struct hte_item_s *NEXT;    /* pointeur sur l'item suivant */
    591     char KEY[];                 /* tableau flexible contenant la clé */
    592 }; 
    593 }}}
    594 {{{   
    595 char *namealloc (char *key)
    596 {
    597     int index;
    598     hte_item_t *curr;
    599     static hte_root_t *root_namealloc;
    600 
    601     if (key)
    602     {
    603         /* création du dictionnaire la première fois */
    604         if (root_namealloc == NULL)
    605             root_namealloc = hte_create (MAX_NAMEALLOC);
    606    
    607         /* calcul de l'index pour trouver la liste ou devrait être l'item */
    608         index = hte_hash (key) % root_namealloc->NB_LIST;
    609 
    610         /* recherche et l'item dans sa liste et sortie si trouvé */
    611         for (curr = root_namealloc->LIST[index]; curr; curr = curr->NEXT)
    612         {
    613             if (strcmp (curr->KEY, key) == 0)
    614                 return curr->KEY;
    615         }
    616    
    617         /* création d'une nouvelle entrée */
    618         curr = malloc (sizeof (struct hte_item_t *) + strlen (key) + 1);
    619         if (curr)
    620         {
    621             strcpy (curr->KEY, key);
    622             curr->NEXT = root_namealloc->LIST[index];
    623             root_namealloc->LIST[index] = curr;
    624             return curr->KEY;
    625         }
    626     }
    627     perror ("namealloc");
    628     exit (1);
    629 }   
    630 }}}