Etape 6: le fichier qmtcl1.cpp

Le fichier qmtcl1.cpp contient des routines qui décodent les arguments fournies dans une commande Tcl par l'utilisateur pour qu'ils soient compatibles avec vos fonction de calcul.

Lorsqu'un utilisateur tape dans la console (ou que l'on écrit dans un script) la commande :

qm_dms2deg 12 34 22

Tcl voit ici un mot clef (qm_dms2deg) est trois arguments qu'il traite comme trois chaînes de caractères. Le rôle des fonctions du fichier qmtcl1.cpp est triple :

(1) Vérifier que l'utilisateur à bien entré les trois arguments nécessaires au bon fonctionnement de la commande.

(2) Convertir les arguments en valeurs compatibles avec les fonctions C. Par exemple ici les trois paramètres chaînes de caractères vont être converties en trois arguments de type entier. Une fois l'opération réalisée, la fonction de calcul est appelé avec les paramètres bien formatés.

(3) Retourner à la fin du calcul un message qui sera par exemple affiché sur la console de l'interpréteur Tcl.

Voici le code qui correspond à cette description pour les fonctions CmdDmse2deg et CmdJd :

// Projet      : AudeLA
// Librairie   : LIBQM
// Fichier     : QMTCL1.CPP
// Description : Fonctions interfaces entre TCL et C
// =================================================

#include "libqm.h"

/*************** CmdDms2deg ***************/
/* Convertion des degrés/minutes/secondes */
/* en degrés décimaux                     */
/******************************************/

int CmdDms2deg(ClientData clientData,Tcl_Interp *interp,int argc,char *argv[])
{
char s[256];
double angle;

// Vérifie que la commande a le bon nombre d'argument
// --------------------------------------------------

if (argc!=4)
   {
   sprintf(s,"Usage: %s d m s", argv[0]);
   Tcl_SetResult(interp,s,TCL_VOLATILE);
   return TCL_ERROR;
   }

// Calcul de la convertion
// -----------------------

if (dms2deg(atoi(argv[1]),atoi(argv[2]),atof(argv[3]),&angle)==PB)
   {
   strcpy(s,"Erreur dans la fonction dms2deg");
   Tcl_SetResult(interp,s,TCL_VOLATILE);
   return TCL_ERROR;
   }

// Sortie du résultat sur la console
// ---------------------------------

sprintf(s,"%lf",angle);
Tcl_SetResult(interp,s,TCL_VOLATILE);
return TCL_OK;

}

/*************** CmdJd **************/
/* Calcul du jour Julien            */
/************************************/

int CmdJd(ClientData clientData,Tcl_Interp *interp,int argc,char *argv[])
{
char s[256];
double jj;

// Vérifie que la commande a le bon nombre d'argument
// --------------------------------------------------

if (argc!=4)
   {
   sprintf(s,"Usage: %s année mois jour", argv[0]);
   Tcl_SetResult(interp,s,TCL_VOLATILE);
   return TCL_ERROR;
   }

// Calcul de la convertion
// -----------------------

if (jd(atoi(argv[1]),atoi(argv[2]),atof(argv[3]),&jj)==PB)
   {
   strcpy(s,"Erreur dans la fonction dms2deg");
   Tcl_SetResult(interp,s,TCL_VOLATILE);
   return TCL_ERROR;
   }

// Sortie du résultat sur la console
// ---------------------------------

sprintf(s,"%lf",jj);
Tcl_SetResult(interp,s,TCL_VOLATILE);
return TCL_OK;
}

Analysons la routine CmdDms2deg et tout particulièrement les variables argc et argv. argc contient le nombre d'arguments que l'utilisateur a entrée à la suite du mot clef, incrémenté de un. Par exemple pour la commande qm_cmd2deg, la syntaxe ordonne de fournir 3 arguments, si bien que la valeur de argc doit être 4 (3 + le nom de la commande qui est ici comptabilisée comme un argument).

La première opération que nous réalisons est donc de vérifier que le nombre d'argument est correct :

if (argc!=4)
   {
   sprintf(s,"Usage: %s d m s", argv[0]);
   Tcl_SetResult(interp,s,TCL_VOLATILE);
   return TCL_ERROR;
   }

Si tel n'est pas le cas la commande de la bibliothèque Tcl Tcl_SetResult ce charge de rappeler à l'utilisateur la bonne syntaxe. Le message d'erreur est écrit dans une variable de type chaîne de caractère (ici la variable s). La fonction Tcl_SetResult fait en sorte que cette chaîne soit gardée en mémoire pour être restitué sur la console de l'utilisateur automatiquement au retour de la routine CmdDms2deg.

La variable argv est quant à elle une liste de pointeurs vers des chaînes de caractères. Le premier élément de la liste, argv[0], pointe vers une chaîne de caractère qui contient le nom de la commande entrée par l'utilisateur. argv[1], argv[2], argv[3] pointent respectivement vers les chaînes de caractères correspondant au premier, second et troisième argument de la commande. Il est très important de ce rappeler ici qu'un script Tcl ne manipule à la base que des chaînes de caractères. C'est la raison pour laquelle nous utilisons la fonction C atoi lors de l'appel de notre fonction dms2deg, qui se charge ici de convertir une chaîne en un nombre entier. Pour convertir une chaîne en nombre réel on aurait utilisé la fonction C : atof, et ainsi de suite (nota : il est possible aussi d'effectuer ces opérations de conversion avec des fonctions Tcl prévu pour cela, comme Tcl_GetInt ou Tcl_GetDouble) :

dms2deg(atoi(argv[1]),atoi(argv[2]),atof(argv[3]),&angle)

dms2deg retourne la valeur de l'angle en degré décimaux. Ce résultat est convertie en chaîne pour pourvoir être affiché sur la console dès le l'on sort de la fonction CmdDms2deg :

sprintf(s,"%lf",angle);

La fonction CmdJd réalise le décodage des argument pour le compte de la fonction C jd. Ce type d'opération n'a plus de secret pour vous à présent !

Comme à l'accoutumé créez une nouvelle fenêtre, entrez le code sous le nom qmtcl1.cpp dans le répertoire des sources, puis compilez.

Vous venez d'achever l'écriture du code source de votre librairie.

 

                (5/6)