Les étapes de l'externalisation d'une fonction

Dans cette page, on considèrera pour exemple la fonction SetCommand_Exec qui code dans le fichier UserDiscreteProcess.cc la détermination de la commande (freinage / accélération) dans l'application du toboggan (voir la page 'Présentation générale et exemples')). Elle est affectée par SetExec au corps de l'instance de la méthode prédéfinie ExecProcess attachée au processus SetCommand lors de la construction de celui-ci.

Ecrire la routine perl

... et la placer dans un fichier <nom_fichier>.pl dont on dira plus loin comment il est exploité par le simulateur. L'ossature du code est la suivante :

sub freinageAcceleration_execProcess {
    $pM = @_[0];
    ...
}
Le code complet sera donné dans la page qui indique la manière d'appeler des services de DIESE dans le code perl.

Noter cependant ici que la routine perl reçoit de DIESE en argument implicite le pointeur sur l'instance de Method qui est l'argument explicite de la fonction SetCommand_Exec. Le langage perl référence cet argument par @_[0]. On affecte cette valeur à la variable locale $pM (noter que perl préfixe toute variable par le caractère 'dollar'). \

Noter encore la règle de nommage de la routine perl. Alors que le nom de la fonction C++ est libre (le nom choisi devient l'argument de la méthode SetExec dans le constructeur du processus), le nom de la routine doit être d'une des deux formes suivantes :

Doter le simulateur d'un interpréteur perl

La routine perl, bien qu'écrite, n'est pas d'une utilisation obligatoire. Si un interpréteur perl n'a pas été créé, ou s'il a été créé en lui donnant l'adresse d'un autre fichier que celui dans lequel on a rangé la routine, alors DIESE continue d'invoquer la version compilée (SetCommand_Exec).

Pour créer un interpréteur, il suffit d'invoquer le service DIESE NewPerlInterpreter.

Attention ! La fonction NewPerlInterpreter associe un fichier à l'interpréteur. Ce fichier est bien sûr celui mentionné après le mot-clé PERL_FIC dans la phrase ci-dessus. L'invocation explicite dans le programme principal doit être précédée de la désignation de ce fichier. Cela se fait par l'instruction suivante :
     pCurrentSim->SetPerlFile("../perl/toboggan.pl");
La version courante de DIESE ne sait gérer qu'un seul interpréteur à la fois, et cet interpréteur ne peut accéder qu'à un seul fichier à la fois. Cependant, il est possible de diriger l'interpréteur sur plusieurs fichiers successivement : dans DIESE, il faut le supprimer (voir plus loin) puis le créer à nouveau en l'associant à un fichier différent.

Exploiter les services DIESE d'interprétation de routines perl

Pour notre exemple, ceci est réalisé par l'appel suivant :

     PerlVoidFunction(str, pM);
où :
\indent str est le nom de la routine perl. Ici : "freinageAcceleration_execProcess" \ \indent pM est l'instance de Method qui sera passée à la routine perl en argument implicite de rang 0, autrement dit l'instance de Method (du processus) dont le corps est externalisé. Ici, c'est l'instance de la classe prédéfinie ExecProcess qui a reçu comme corps compilé la fonction SetCommand_Exec. \

L'appel ci-dessus est construit et réalisé automatiquement par DIESE, plus précisément par les services tels que ExecVoidMethod de la classe Process, lequel est justement celui qui est invoqué dans notre exemple, puisque la méthode prédéfinie en question possède un corps de type void (voir la classe Process, page 'Affectation d'un corps aux méthodes', et 'Méthodes prédéfinies de processus/Exécution d'un processus discret'). \

Quant à l'appel à ExecVoidMethod, il est fait lui aussi automatiquement dans la méthode du moteur de simulation qui réalise l'exécution de l'effet d'un processus ponctuel, lors du dépilement de l'événement correspondant. En fait, l'exploitation des services d'interprétation de routines perl est entièrement pris en charge par DIESE pour les méthodes prédéfinies. Par contre, le développeur doit invoquer lui-même les services tels que ExecVoidMethod pour les méthodes non prédéfinies.

Supprimer l'interpréteur perl

Lorsque plus aucun appel à l'interpréteur perl ne doit être fait, il est bon de le supprimer, par une invocation de DeletePerlInterpreter. Un tel appel est fait automatiquement dans le destructeur de la simulation courante (pCurrentSim) si un interpréteur a été créé. On sait qu'on libère la mémoire occupée par pCurrentSim par un appel explicite delete pCurrentSim; dans le programme principal, ou bien, dans un fichier de directives de la simulation, par une directive DELETE SIMULATION ou DELETE ALL.


This page was generated with the help of DOC++.