L'appel des services de DIESE dans le code externalisé

Les fonctions (corps de méthodes) externalisées font généralement appel à des services de DIESE. Parmi les plus fréquemment utilisés figurent les services des sous-classes de Method qui renvoient l'objet (entité, processus, …) dont l'instance de Method est un attribut fonctionnel. Dans notre exemple, on utilise le service DescribedDiscreteProcess de la classe ProcessMethod. Y figurent aussi les services de la classe Method qui renvoient les arguments (instances d'Argument) de la méthode. Il se trouve que la méthode choisie pour notre exemple (ExecProcess) ne possède pas d'argument.

Voici le code de la routine perl réalisant le même effet que la fonction SetCommand_Exec :

 
use bdiese;
use appli;
sub freinageAcceleration_execProcess {
    $pM = @_[0];
    $pP = bdiese::ProcessMethod_DescribedDiscreteProcess($pM);
    $pDriver = bdiese::Process_ProcessedEntity($pP);
    $pCar = bdiese::Entity_GetSuperEntity($pDriver);
    $X = bdiese::Entity_GetFloatValue($pCar, $appli::POSITION);
    $V = bdiese::Entity_GetFloatValue($pCar, $appli::SPEED);
    $frontiere = - 0.06*$X**2 - 0.03*$X + 0.01;
    if($V < $frontiere) {
       bdiese::Entity_SetValue($pDriver, $bdiese::COMMAND, -1);
    }
    else {
       bdiese::Entity_SetValue($pDriver, $bdiese::COMMAND, +1);
    }
}
On a de fait illustré les quelques règles de transcription du code C++, en général préexistant, en code perl :

Reste à dire qu'au-delà du respect de ces règles d'écriture, il existe une autre condition pour que l'interpréteur perl sache reconnaître et manipuler les objets et services de DIESE : on doit avoir intégré dans le code exécutable du simulateur des "versions" des objets C++ spécialement "équipées" à cet effet. Cet "équipement" a lieu dans les procédures de compilation et d'édition de liens, celle de la bibliothèque DIESE pour les services qu'elles fournit, ou bien celle du simulateur pour les autres objets et services. Les objets équipés sont placés dans des librairies (les modules) qui faut charger en préambule du fichier des routines, à l'aide de la directive use <module>. La page suivante expose comment satisfaire cette condition.


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