La commande d'exécution du simulateur (./main ...) possède des arguments, pour spécifier des données en entrée, ou pour préciser des options d'exécution. DIESE prédéfinit quelques arguments standards et propose, par la fonction ParseMainArguments, un moyen d'interpréter leurs valeurs dans la ligne de commande. Cette fonction, ou toute autre écrite par l'utilisateur qui aurait le même rôle, doit être appelée en début de programme principal. Dans le cas contraire, les arguments seraient ignorés (conduisant normalement à une erreur d'exécution) ou absents (ce qui dénoterait une exécution non paramétrée, d'un intérêt quasi nul).
Outre ceux prédéfinis par DIESE, l'utilisateur peut ajouter des arguments qui ont une utilité propre à son application. La fonction ParseMainArguments fournit par DIESE ne suffit alors plus et l'utilisateur doit écrire lui-même la fonction d'analyse de la ligne de commande. Une pratique conseillée est de toujours invoquer ParseMainArguments en préambule de cette fonction particulière à l'application, laquelle n'a plus, dans sa suite, qu'à traiter l'interprétation des arguments spécifiques.
Le premier argument de ParseMainArgument (et donc de toute fonction écrite par l'utilisateur venant la compléter) est le nombre d'arguments de la commande exécutable + 1. Par exemple, cet argument recevra la valeur 2 si la commande est main -h. Le second argument de ParseMainArgument est le tableau des arguments de la commande exécutable. La manière la plus simple de passer ces deux valeurs à ParseMainArgument est d'utiliser les arguments de la fonction main() (typiquement nommés argc et argv). Dans ce cas, le nom de la commande (main) est l'élément de rang 0 de argv :
int main (int argc, char* argv[]) { App_ParseMainArguments(argc, argv); ... }; void App_ParseMainArguments (int argc, char* argv[]) { //--------------------------------------------- Boolean stdArgs_ok = ParseMainArguments(argc, argv); if(stdArgs_ok) { for (int i=6;i<argc;i++) { if (!strcmp(argv[i], "-w")) gMyTraceWarnings = TRUE; if (!strcmp(argv[i], "-o")) gMyTraceOperations = TRUE; } } }Rôle de ParseMainArguments
Dans sa version courante, ParseMainArguments teste la présence dans la ligne de commande des arguments suivants, et donne le cas échéant la valeur mentionnée aux variables globales correspondantes :
-V g_BD_TraceActionMode TRACE_ACTION_ON -M g_BD_TraceNewDelMode TRACE_NEWDEL_ON -MR g_BD_MemoryReportMode MEM_REPORT_ON -Warn g_BD_TraceWarnings TRACE_WARN_OFF -T g_BD_TraceTableauMode TRACE_TABLEAU_ON -L g_BD_TraceListeMode TRACE_LISTE_ON -IDN n gCurrentSimNumId nSi la ligne de commande est main -h, le résultat est l'affichage de la manière d'invoquer la commande, avec un rappel du sens des arguments obligatoires et optionnels.
Les autres arguments reconnus sont les suivants (on rappelle que l'argument de rang 0 est le module exécutable lui-même) :
- La présence parmi les arguments à partir du rang 6 de l'option -V (verbose) permet d'éditer sur la sortie standard des messages sur les actions mises en oeuvre par le moteur de simulation, notamment relatives aux événements occurrents et aux processus mis en jeu. La variable globale gTraceActionMode prend la valeur TRACE_ACTION_ON (équivalente à TRUE).
- La présence parmi les arguments à partir du rang 6 de l'option -M (memory) permet d'éditer sur la sortie standard les messages relatifs aux constructions et destructions d'entités. La variable globale gTraceNewDelMode prend la valeur TRACE_NEWDEL_ON (équivalente à TRUE).
- La présence parmi les arguments à partir du rang 6 de l'option -MR (memory report) permet d'éditer sur la sortie standard un rapport synthétique que les nombres de constructions/destructions d'objets. La variable globale g_BD_MemoryReportMode prend la valeur MEM_REPORT_ON (équivalente à TRUE).
- La présence de l'option -Warn permet d'éditer sur la sortie standard des messages d'avertissement sur une situation sinon anormale, du moins atypique, et qui mérite une analyse pour justification ou correction.
- La présence de l'option -T (Tableau) parmi les arguments à partir du rang 6 demande au moteur de simulation d'éditer sur la sortie standard des messages relatifs aux créations et suppressions de tableaux. La variable globale gTraceTableauMode prend la valeur TRACE_TABLEAU_ON (équivalente à TRUE).
- La présence de l'option -L (Liste) parmi les arguments à partir du rang 6 demande au moteur de simulation d'éditer sur la sortie standard des messages relatifs aux créations et suppressions de listes. La variable globale gTraceListeMode prend la valeur TRACE_LISTE_ON (équivalente à TRUE).
- La présence parmi les arguments à partir du rang 6 de l'option -IDN <val> (identifiant numérique) attribue un numéro à la simulation. La variable globale gCurrentSimNumId prend la valeur <val>. Cette valeur pourra figurer dans les lignes de trace d'état écrites sur un fichier ou une base de données. Le constructeur d'une simulation lui attribue la valeur de gCurrentSimNumId comme identifiant numérique, celui renvoyé par le service GetNumId.
Rôle complémentaire de App_ParseMainArguments
Elle est placée, normalement, dans les fichiers UserFunction.h et .cc. Dans l'exemple ci-dessus, on tient compte de la présence, généralement vérifiée, des 5 arguments correspondant aux fichiers d'entrée de la simulation (voir page 'Les fichiers en entrée de type déclaratif'). Sachant que la commande 'main' est, par convention C, le premier élément du tableau argv, on n'examine que les arguments à partir du rang 6 et au-delà. Une option de commande spécifique est prévue :
-w gMyTraceWarnings TRUEgMyTraceWarnings est une variable globale définie dans l'application. Elle peut servir dans des instructions conditionnées à la présence de l'option dans la ligne de commande, ici des instructions de trace d'avertissements.Exemples de lignes de commandes :
main f.par f.sim f.osp f.str f.dir -V -M
demande une simulation avec impression des deux types de messages.
main f.par f.sim f.osp f.str f.dir -V -M
demande une simulation avec impression des messages de construction/destruction seulement.main f.par f.sim f.osp f.str f.dir -V -M -IDN 18
demande une simulation identifiée par le numéro 18.