Etape 5 : création du fichier libqm.cpp

Nous abordons à présent l'écriture du code réalisant l'interface entre vos fonctions de calcul et le langage de script Tcl. Tout ce passe dans le fichier libqm.cpp (mais vous pouvez lui donner le nom de votre choix), qui ne contient qu'une seule fonction : Qm_Init. Nous s'avons que cette fonction constitue le point d'entrée unique de votre librairie.

Voici le code complet de libqm.cpp :

// Projet      : AudeLA
// Librairie   : LIBQM
// Fichier     : LIBQM.CPP
// Description : Point d'entrée de la librairie
// ============================================

#include "libqm.h"

// *********** Qm_Init **********
// Point d'entrée de la librairie
// ******************************

int __stdcall Qm_Init(Tcl_Interp *interp)
{
  
// Ajoutez ici vos propres fonctions externe...
// -------------------------------------------------------------

Tcl_CreateCommand(interp,"qm_dms2deg",CmdDms2deg,(ClientData)NULL,
(Tcl_CmdDeleteProc *)NULL);
Tcl_CreateCommand(interp,"qm_jd",CmdJd,(ClientData)NULL,(Tcl_CmdDeleteProc *)NULL);

return TCL_OK;

}

Notez le paramètre de la fonction Qm_Init : il s'agit d'une structure (dont le type est défini dans le fichier Tcl.h) qui est le lien organique entre votre librairie et l'interpréteur Tcl.

Le coeur de libqm.cpp tiens dans les deux lignes suivantes :

Tcl_CreateCommand(interp,"qm_dms2deg",CmdDms2deg,(ClientData)NULL,
(Tcl_CmdDeleteProc *)NULL);
Tcl_CreateCommand(interp,"qm_jd",CmdJd,(ClientData)NULL,(Tcl_CmdDeleteProc *)NULL);

C'est à cet endroit qu'est fait le lien symbolique entre le nom de vos nouvelles fonctions telles que les verra un utilisateur et le nom des fonctions telles qu'elles sont codé dans la librairie. L'opération est effectuée par une fonction de la librairie Tcl qui a pour nom Tcl_CreateCommand. Son nom est assez subjectif, elle signifie qu'une nouvelle commande Tcl est créée à partir du code C que vous avez écrit. Ici il y a deux appels à Tcl_CreateCommand car nous ajoutons deux nouveaux mot clefs au langage Tcl. Ainsi, un utilisateur verra votre fonction de conversion d'angle sous le nom qm_dms2deg (c'est le second paramètre de Tcl_CreateCommand qui défini se nom). De même, pour calculer le jour Julien l'utilisateur serra amener à utiliser le nom de commande qm_jd. Par exemple pour convertir l'angle 3°40'32" en degrés décimaux il faudra utiliser la syntaxe :

qm_dms2deg 3 40 32

Le nom de la commande est bien sur arbitraire. Vous auriez pu parfaitement utiliser le nom football, mais mieux vaut conserver un nom explicite pour l'utilisateur. Ici j'ai utilisé le suffixe qm_ pour montrer que cette commande fait partie de la librairie LIBQM. Ce type de suffixe est aussi utile pour éviter des conflits avec un nom de commande similaire issue d'une autre extension Tcl.

Le troisième paramètre de Tcl_CreateCommand défini le nom interne de la commande, c'est à dire le nom de la fonction C dans le librairie. A priori on pourrait s'attendre pour la fonction de conversion d'angle que ce nom soit dms2deg (voir l'étape 4). Or, il n'en est rien, ce nom est CmdDms2deg. La même anomalie est à noter pour la fonction du calcul du jour Julien : Tcl_CreateCommand fait le lien entre le nom symbolique de la commande avec une fonction C qui s'appelle CmdJd au lieu de jd.

CmdDms2deg et CmdJd sont en fait des fonctions intermédiaires qui finissent par appeler respectivement dms2deg et jd, mais entre-temps, elles ont pour charge de décoder les arguments des commandes. Le choix est fait ici de découpler les fonctions de calcul proprement dite et les fonctions qui font l'interface avec l'utilisateur (ici le décodage des arguments). Vous pouvez bien sur structurer votre code de manière tout à fait différente. L'écriture du code de CmdDms2deg et CmdJd sera abordée à l'étape 6.

Pour créer le fichier libqm.cpp faites New... depuis le menu File de l'environnement de programmation Visual C++. Demandez la création d'un fichier du type C++ Source File et donnez lui le nom libqm :

Dans la fenêtre qui vient de s'ouvrir, entrez le code de libqm.cpp donné ci-dessus.

Voici la fenêtre d'édition de libqm.cpp :

 
 

                   (4/6)