Listes
Sisal permet de déclarer des listes de données. Une liste est équivalente à un tableau à une seule dimension mais qui peut être redimensionné. Une liste peut-être spécialisée et optimisée pour certains types de données. Cette structure doit être déclarée dans une partie Var d ’un script ou d ’un synoptique.
List;
List of Structure;
Les listes d'entiers (List of int [1] ) et de chaines de caractères (List of string) sont optimisés par Sisal afin d'en accélérer le traitement. On peut définir une liste de constante avec la syntaxe suivante.
{ item [, item] }
Les exemples suivants montrent différentes déclarations de liste :
MaListe List; // Liste de valeurs quelconques MesEnreg List of int; // Liste d'entier chaque entier est un numèro d'enregistrement MesReferences List of string; // Liste de références
Le référencement d ’un élément d'une liste se fait en indiquant le rang de la variable entre crochets.
MaListe[ 3] = 0; MesProduits.Read( MesEnreg[i]); Encours[ 25].Date = Now() ;
Le premier élément de la liste est accédé par 0 et le dernier par la taille de la liste moins 1. Rang peut être négatif, dans ce cas il désigne l'élément accédé par la taille de la liste moins le rang.
DerniereValeur = MaListe[-1]; // -1 désigne toujours la dernière valeur de la liste sauf quand elle est vide
Si on essaye de lire une donnée à un rang inférieur à 0 ou supérieur à la taille de la liste moins un, on obtient la valeur nulle.
Si on essaye d'affecter une valeur à un rang supérieur à la taille moins un, la taille de la liste est rallongée, les nouveaux éléments sont indéfinis (ou valorisé à 0 pour des entiers et à la chaîne vide pour des chaînes).
Si on essaye d'accéder à un rang < 0 (après prise en compte de la convention « valeur négative => taille - valeur ») une exception système est levée.
On peut affecter une variable liste par une autre variable ou une liste de constante.
MaListe = { 1, 2, 3, 5, 8, 13};
MaListe = MesEnregs;
MesReferences = { « XY412 », « ZK42 », « 45C18 »};
Des méthodes et des fonctions système spécifiques permettent de gérer les listes.
La méthode Add ou la fonction List_Add permet de rajouter une donnée dans la structure après un certain rang.
List.Add( Value {, rang}) : status
List_Add( List, Value {, rang]) : status
Le paramètre rang peut être négatif, dans ce cas il désigne l'élément en partant de la fin de liste, par défaut pour la méthode Add rang vaut -1 donc désigne le dernier élément, et rajouter un élément après le dernier élément équivaut à rajouter un élément à la liste.
La méthode Insert ou la fonction List_Insert permet d'insérer une donnée dans la liste avant un certain rang.
List.Insert( Value {, rang}) : status
List_Insert( List, Value {, rang}) : status
Le paramètre rang peut être négatif, dans ce cas il désigne l'élément en partant de la fin de liste, par défaut pour la méthode Insert rang vaut 0 donc désigne le premier élément, et rajouter un élément avant le premier élément équivaut à rajouter un élément en début de liste.
La méthode Remove ou la fonction List_Remove permet de retirer une donnée de la structure.
List.Remove( {rang}) : status
List_Remove( list { , rang}) : status
Par défaut rang vaut 0, donc cela équivaut à retirer la tête de liste.
La méthode Size ou la fonction Count permet de compter le nombre d'enregistrement d'une pile ou d'une file.
List.Size() : Entier
Count( List) : Entier
La méthode Find ou la fonction LIST_Find permettent de retrouver une élément d'une liste par sa valeur.
List.Find( value) : rang
List_Find( list, value) : rang
Si la valeur n'est pas retrouvé dans la liste la méthode retourne null.
On peut itérer sur les éléments d'une liste
Par exemple
For i in MaListe do Message( Value(I));
affiche toutes les valeurs de MaListe. Dans ce cas I est un itérateur et pour obtenir la valeur pointée par lui il faut utiliser la fonction système Value.
[1] Avec la version 4.5 la seule façon de forcer une liste d'entiers est d'affecter à une liste une liste d'entiers qui aura été créées par un list_ordered(0) ou MaList.oredered(0).