Arcane  v3.14.11.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Exemple n°1

Dans ce premier exemple, on va réutiliser l'exemple 1 du sous-chapitre précédent (Exemple n°1) mais en modifiant le point d'entrée exit.

On va utiliser les deux services en tant que singleton ici.

Fichier .config

Pour commencer, voyons le .config :

csv.config <time-loop name="example1">

<singleton-services>
<service name="SimpleCsvOutput" need="required" />
<service name="SimpleCsvComparator" need="required" />
</singleton-services>

Ici, on voit les deux singletons que l'on va utiliser.

Point d'entrée initial

Voici le point d'entrée start-init :

SimpleTableComparatorExample1Module.cc

void SimpleTableComparatorExample1Module::
initModule()
{
srand(1234);
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
table->init("Results_Example1", "example1");
}

Point d'entrée loop

Le point d'entrée compute-loop :

SimpleTableComparatorExample1Module.cc

void SimpleTableComparatorExample1Module::
loopModule()
{
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
table->addColumn("Iteration " + String::fromNumber(m_global_iteration()));
Integer nb_fissions = rand()%99;
Integer nb_collisions = rand()%99;
table->addElementInRow("Nb de Fissions", nb_fissions);
table->addElementInRow("Nb de Collisions", nb_collisions);
if (m_global_iteration() == 3)
subDomain()->timeLoopMng()->stopComputeLoop(true);
}

Point d'entrée exit

Enfin, voyons le point d'entrée exit :

SimpleTableComparatorExample1Module.cc

void SimpleTableComparatorExample1Module::
endModule()
{
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
ISimpleTableComparator* comparator = ServiceBuilder<ISimpleTableComparator>(subDomain()).getSingleton();
comparator->init(table);
if(!comparator->isReferenceExist()){
info() << "Écriture du fichier de référence";
comparator->writeReferenceFile();
}
else {
if(comparator->compareWithReference()){
info() << "Mêmes valeurs !!!";
}
else{
error() << "Valeurs différentes :(";
IArcaneMain::arcaneMain()->setErrorCode(1);
}
}
table->writeFile();
}

On peut voir un exemple minimal d'utilisation du comparator. On commence par récupérer le pointeur vers le singleton puis on initialise le comparator en lui donnant un pointeur vers un objet ayant comme interface ISimpleTableOutput.

Ensuite, on regarde si un fichier de référence existe. S'il n'y en a pas, on le crée avec les valeurs de table.
En effet, le service SimpleCsvComparator est aussi capable d'écrire des fichiers. Il va utiliser les informations du ISimpleTableOutput pour trouver le chemin.

Si on regarde dans le point d'entrée init, on peut voir l'initialisation du service SimpleCsvOutput :

table->init("Results_Example1", "example1");

SimpleCsvComparator va utiliser ces informations pour écrire le fichier de référence. Dans cet exemple, il va aller écrire le fichier ici :

./output/csv_refs/example1/Results_Example1.csv

Si le fichier de référence existe déjà, le comparator va le comparer avec les valeurs de l'objet table.
Si les valeurs sont identiques, on aura le message Mêmes valeurs !!! dans la sortie, sinon on aura Valeurs différentes :( (et un code d'erreur 1).

À la fin, le service SimpleCsvOutput écrit son fichier, comme d'habitude.

Remarques
Vous l'aurez compris, il faut lancer l'exemple deux fois pour voir ce qu'il se passe.