SUBPROG |
Subprogpermet de déclarer un sous-programme pouvant comporter une liste d'arguments,appelable par Call.
Subprogsous_prog[ '(' liste_args')' ]
Elément | Description | Restrictions |
nom_d'OBJet désignant le sous-programme. | Aucune. | |
Liste de nom_de_variables séparés par lecaractère ','. | Les arguments doivent avoir des nomsdistincts. |
# Appel d'un sous-programmed'incrémentation de compteur dans le
# traitement courant
Call INCR_CPT(10,OK)
...
# Un peu plus loin dans le mêmetraitement...
Value Integer DELTA
Variable Libelle ST
Lock COMPTEUR Withlockwait = 5
ST = [S]fstat
If ! ST
[C]COMPTEUR += DELTA
Unlock COMPTEUR
Endif
End
Un sous-programme déclaré par l'instruction
Lorsque le sous-programme comporte des arguments, il est possible, mais nonimpératif, de les déclarer (tous ou en partie) à la suite de l'instruction
Outre leur type et dimension, on précisera s'ils sont passés par adresse oupar valeur en utilisant un des mots-clés suivant :
On peut utiliser comme type d'arguments les mêmes que pour les variables(Libelle, Shortint, Integer, Date, Decimal et Char).
Par défaut, le type sera :
Exemple :
Local Integer A
A = 1
Call EXP1(A,2,3)
End
SubprogEXP1(A,B,C)
Variable Integer A
Value Integer B, C
Infbox num$(type(A))-num$(A)-num$(B)-num$(C):# on affichera 4 1 2 3
End
La longueur des arguments de type Char ne sera pas précisée. On secontentera de faire suivre le nom de l'argument par (). La longueur de lavariable locale sera celle de l'argument passé par Call.
Après le type, il est indispensable de préciser la dimension s'il y en aune, en utilisant les caractères "(" et ")". Pour déclarerplusieurs dimensions il faudra utiliser des virgules pour les séparer.
Exemple : Value Decimal MAT(,) déclare un tableau bi-dimensionné de nombresDCB dont les tailles dépendront de l'argument passé par Call et dont les bornesinférieures seront 0 pour les 2 dimensions.
Par défaut - c'est à dire si on ne précise rien - la taille de chaquedimension sera celle de l'argument et sa borne inférieure sera 0. On peutpréciser la taille de chaque dimension par une expression à valeur entiére ouune variable passée elle aussi en paramètre. Dans ce dernier cas, cettevariable devra impérativement être déclarée avant.
Exemple : Variable Char ARGS () (AC,GV)
déclare une tableau bi-dimensionné de chaine de caractères, la premièredimension allant de 0 à AC - 1, la deuxième de 0 à GV -1.
On pourra préciser la borne inférieure. Si on a précisé la borne inférieure,on pourra aussi préciser la borne supérieure. Si on ne le fait pas, la taillerésultante sera celle de l'argument. Ces bornes pourront être des expressions àvaleur entière, des variables. Les bornes inférieures seront suivies de"..".
Exemple : Value Integer CUB(N11..,N21..N22,) déclare un tableau d'entiers àtrois dimensions, indicé à partir de N11 pour la première, de N21 à N22 pour ladeuxième et à partir de 0 pour la troisième.
Si on précise des bornes, ces bornes n'ont pas à être identiques à cellesdes arguments des traitements appelants, l'élément de plus petit indice del'argument du Call sera associé à (ou recopié dans) l'élément de plus petitindice de la variable locale du sous-programme et ainsi de suite.
Exemple :
Integer T(1..M, 3..N)
Call SP(T)
SubprogSP (TAB2)
Value Integer TAB2(,)
Dans ce cas l'élément TAB2(0,0) pointera sur T(1,3) etc.
Au lancement d'un sous-programme, une classe de variable locale est crée.Les variables déclarées dans le sous-programme seront par défaut de cetteclasse. Elle sera automatiquement détruite par le End final.
Un sous-programme peut accéder, pendant son exécution, aux variablesglobales et aux OBJets Adonix des traitements appelants. Pour ne pas modifierle contexte, au retour du sous-programme appelé par Call, on déclarera lesOBJets propres à ce sous-programme en mode Local (Local File, Local Mask, LocalMesbox, Local Inpbox ). Ils seront automatiquement refermés par le End final.
La création d'une classe locale fait qu'un sous-programme appelé par Callest toujours plus long à exécuter qu'une étiquette appelée par Gosub. Lessous-programmes permettent par contre une meilleure modularité et une meilleurelisibilité.
Pendant l'exécution d'un sous-programme, les informations suivantes sontconservées :
Par contre sont perdus :
D'autre part, un sous-programme ne peut pas terminer une transaction qu'iln'aurait pas lui-même initiée.
ERRET(32) | Transactioninitiée dans un autre programme. |
ERDIM(55) | Nombrede dimensions incorrect. |
ERVEX(61) | Variabledéjà existante. |
CALL - VALUE - VARIABLE - CONST - END - MASK - FILE- INPBOX - MESBOX
Adonix X3(r) L4G |