Remarques 1

    Il est exceptionnel (et déconseillé dans le cas général) que plusieurs classes soient mises dans le même fichier. Cela n'arrivera que lorsqu'elles sont très proches et très dépendantes les unes des autres (par exemple pour la classe CTimer et ses dérivées, dans la suite de ce TP).


Rappels :
  1. ne jamais utiliser la clause using namespace dans un fichier inclus (.h ou .hxx) ==> le préfixage doit être fait très méticuleusement et avec beaucoup d'attention. Nous définissons des classes dans l'espace de noms nsSysteme, donc tout autre espace de noms doit être indiqué :
  2. bien que non obligatoire, il est fortement recommandé d'indiquer pour chaque fonction son comportement vis-à-vis des exceptions : si elle n'est sensée en lever aucune, indiquer throw(). Malheureusement, beaucoup trop de programmeurs, n'indiquent rien. Cela signifie pour le compilateur (et pour l'utilisateur) qu'elle peut lever n'importe quelle exception (et non aucune). Nous réservons ce cas à la seule fonction _Edit() qui utilise l'opérateur d'injection << qui pourrait lever une exception (dans la norme) mais ne le fait pas. De plus, c'est une fonction protégée, donc qui ne concerne pas directement l'utilisateur.
  3. une constante littérale entière est par défaut de type int. Lorsqu'elle doit être affectée à un long, il est propre de la postfixer du caractère L : 0L et non 0 (voir le paragraphe du cours de C++ : Les constantes entières et leur type).

    Remarquer l'utilisation de la fonction Normaliser() qui ne sert que de façon interne et qui est donc dans la partie privée.


    Les fonctions qui ont paru les plus courtes ont été mises en inline dans le fichier TimeBase.hxx, les autres sont dans un fichier TimeBase.cxx qui devra êre compilé séparément.


    Le code de CTimevalBase::operator < () mérite un peu d'attention pour sa concision ! De même celui de CTimevalBase::Normaliser() n'est pas inintéressant (on rappelle que l'opérateur % signifie modulo).


    Les codes d'erreur CstDureeNegative et CstNanoDureeNegative ont été ajoutés au type énuméré du fichiers CstCodErr.h


    L'utilisation de la fonction membre get() de l'objet cin n'est pas triviale. En effet, rappelons que, alors que l'extracteur >> saute tous les caractères d'espacement (espaces, tabulations ou retour chariot), la fonction get() lit tous les caractères. Chaque fois qu'un caractère est tapé au clavier par l'utilisateur, il ne peut être pris en compte que lorsque le buffer d'entrée est vidé, par un "retour chariot". Mais ce caractère est lu à son tour par l'appel get() suivant. Le problème ne peut être résolu que par l'ajout d'un appel supplémentaire à get() pour "purger" le buffer de lecture :
 
char c;

cin.get(c);
cout << c << " : caractère lu au bout d'un délai de "
     << CstTimeInit - Time << endl;

cin.get(c); // pour purger le buffer

Remarques 2

    La fonction getdtablesize() est une fonction système. A ce titre, son appel est un SVC (SuperVisor Call) qui provoque une commutation de contexte, opération lourde. D'autre part, il est fort peu probable que le nombre maximal de fichiers (la table des file descriptors) soit modifié en cours d'exécution du  processus (c'est même complètement impossible !!!) Il faut donc appeler une fois pour toutes cette fonction en début de programme et en conserver le résultat dans une constante.

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique

Créé le 30/08/2001 - Dernière mise à jour : 03/09/2001