Simscript III/Dictionnaire des instructions/REMOVE

Un livre de Wikilivres.

L’énoncé remove retire une entité (permanente ou temporaire), une ressource ou un processus d’un ensemble. Il peut s’agir de la première entité, de la dernière ou d’une entité particulière spécifiée par son Repère (index ou pointeur).

Syntaxe :


Ensemble désigne l’ensemble et Repère est une variable entière.


remove first (last) retire l’entité repérée par l’attribut prédéfini F. Ensemble (L.Ensemble) qui désigne le premier (dernier) élément de la file, au sens de la politique de rangement définie dans le preamble (si Ensemble est une file lifo, le first retiré sera le dernier arrivé dans le temps). De plus, le repère de l’entité retirée (index ou pointeur) est mis dans la variable Repère que l’on peut ensuite utiliser pour accéder aux attributs de l’entité retirée, ou pour la détruire...


La forme remove the ... permet de retirer une entité, ou un objet (qui peut être au milieu de la file) repéré par la valeur de Repère qui doit donc être un entier (ou une expression) si la file contient des entités permanentes, ou une adresse mémoire (pointeur) si la file contient des entités temporaires ou de objets.


Si la file est vide lorsqu’on fait un remove first (last), ou si l’entité spécifiée par Repère n’est pas dans la file, on a un message d’erreur. Les expressions logiques suivantes (que l’on peut utiliser dans des constructions if...else...endif) permettent de lever le doute :

Repère  is in Queue
Repère  is not in Queue
Queue is empty
Queue is not empty


Remarque importante :

Si on a l’énoncé : remove first Client from Queue, où Client est le nom d’une entité temporaire déclarée dans le preamble, alors le repère du client retiré est mis dans la variable globale prédéfinie Client, de même nom que l’entité, ce qui est pratique pour l’écriture. Mais si on est dans un processus ou méthode processus et que l’on référence Client un peu plus tard (c’est-à-dire après un délai work/wait ou un suspend dans le processus), la variable globale Client aura très bien pu être prise par un autre client créé entre-temps, dans un autre processus … D’où de gros ennuis … La solution consiste à déclarer Client en variable locale, interne au processus :

process Uc
    define Client as integer variable 	‘‘ indispensable!

    while Queue is not empty
    do
        remove first Client from Queue
        work Es units
        W = time.v - H(Client)		‘‘Il s'agit bien du client qu'on 
        destroy Client			‘‘a retiré avant le work!
    loop;
end ‘‘ Uc