• [^] # Re: Bravo !

    Posté par (site web personnel, Mastodon) . En réponse au journal Portage de TapTempo en Ada. Évalué à 3.

    du coup je n'arrive pas à comprendre où est le code qui permet de mettre par exemple Sample_Size à 1 si celui-ci est 0.
    Une erreur est-elle lancée à la place ?

    Lors de la saisie d'une valeur hors plage, le runtime Ada lance une exception de type CONSTRAINT_ERROR qu'il est tout à fait possible de catcher.
    Ici, il n'est de toutes façons pas possible de saisir, en statique, 0 pour la précision ou le timeout, le compilateur annoncera la levée d'exception dans un warning ces derniers étant des types dont la première valeur est 1.

    Dans le cas de ce programme, le filtrage des valeurs incorrectes est remonté à la gestion des options. Ainsi, le code suivant fournit tout ce qu'il faut pour gérer les valeurs hors plage :

    procedure Prepare_Options(Parser : out Argument_Parser) Is
     begin
     -- Options creation
     Parser.Add_Option(Make_Boolean_Option (False), "help", 'h', Usage =>
     "display this help message");
     Parser.Add_Option(Options.Precision_Option.Make_Option, Precision_Option_Name, 'p', Usage =>
     "set the decimal precision of the tempo display, default is 5 and max is " &
     Precision'Image (Precision'Last));
     Parser.Add_Option(Make_Positive_Option (5), Reset_Time_Option_Name, 'r', Usage =>
     "set the time in second to reset the computation. default is 5 seconds");
     Parser.Add_Option(Make_Positive_Option (1), Sample_Size_Option_Name, 's', Usage =>
     "set the number of samples needed to compute the tempo, default is 1 sample");
     Parser.Set_Prologue ("An Ada version of taptempo.");
    end Prepare_Options;

    Dans le cas simple du type Positive, c'est l'appel à Make_Positive_Option qui gère tout seul, enfin dans la lib Parse_Args, les valeurs hors-plage.
    C'est rendu possible par le fait que les types embarquent leur bornes (par exemple Precision'Last retourne la dernière valeur valide du type Precision.