"func" permet d'appeler une fonction s'exécutant avec ses propres variables locales avec retour au traitement appelant.
SYNTAXE 1
func traitement.fonction ['(' liste_args ')' ]
SYNTAXE 2
func =Expression With ['(' liste_args ')' ]
Elément | Description | Restrictions |
traitement | Traitement dans lequel est défini la fonction (par défaut, il s'agit du traitement courant) | Le traitement doit être accessible. |
fonction | Nom de la fonction | Doit correspondre à un Subprog dans le traitement correspondant. |
expression | Expression de type Char dont le résultat est un nom de fonction ou traitement.fonction | Syntaxe 2. |
liste_args | Liste d'arguments séparés par ','. Ces arguments peuvent être des variables ou des expressions. | Aucune. |
# Appel de la fonction de calcul X du traitement ZETRT
# RESULT donnera le nombre 22Local Integer RESULT
RESULT = 4*(funcZETRT.X(3,2) + 1)
End# la fonction de calcul X du traitement ZETRT
Funprog X(A,B)
Value Integer A
Value Integer B
End A*A/B# autre façon d'appeler la fonction X du traitement ZETRT
Local Integer RESULT
Local Char TRAIT
TRAIT = "ZETRT.X"
RESULT = 4*(func=TRAIT with (3,2))+1
End
"func" permet de lancer une fonction avec passage éventuel de paramètres. A l'issue de cette exécution, le traitement appelant reprend son exécution à l'instruction suivant l'instruction "func", et pourra utiliser le résultat de l'expression précisée dans le End de la fonction. Les variables locales à la fonction et les Objets ouverts par lui en mode Local sont refermés.
Lorsque l'appel "func" est fait sans préciser de traitement, la fonction doit se trouver dans le traitement lui-même. Attention, cependant, lorsqu'on utilise l'instruction Evalue en combinaison avec l'instruction "func", le traitement doit être précisé. En effet, l'instruction Evalue crée un pseudo traitement, dans lequel l'étiquette du "func" n'existe pas.
Les arguments passés dans le "func" doivent être en nombre égaux à ceux de la fonction. L'ordre des paramètres dans "func" étant mis en correspondance avec ceux de Funprog.
Les arguments peuvent être des expressions ou des variables. Si c'est une expression, son passage doit obligatoirement se faire par valeur (Value); l'argument de Funprog ne doit pas être dimensionné.
Une variable passée en argument peut être dimensionnée. Elle doit alors avoir la même dimension que la variable correspondante du Funprog. On peut ne passer qu'une partie.
Exemple : soit un tableau d'entiers à 2 dimensions déclaré par :
Integer T2(I1..I2,J1..J2)
Avec I1 <= I11 <= I21 <= I2 et J1 <= J11 <= J21 <= J2Si on fait func FONCTION( T2 ), on passera tout le tableau.
Si on fait func FONCTION( T2(I1..I2,J1..J2)) idem.
Si on fait func FONCTION( T2(I11,J1..J2)) on ne passera qu'une "ligne".
Si on fait func FONCTION( T2(I1..I2,J11)) une "colonne".
Si on fait func FONCTION( T2(I11,J11) un seul "élément".
si on fait func FONCTION( T2(I11..I21,J1..J2)) plusieurs "lignes".
etc.
Pendant un "func", les informations suivantes sont conservées :
Par contre sont perdues :
Pendant l'exécution d'un "func", il y a création d'une classe de variables locales à la fonction d'abréviation [L]. Cette classe locale devient la classe par défaut, la classe locale au traitement appelant n'étant alors plus accessible. Au retour au traitement, on retrouve la classe locale par défaut, préexistante à l'appel.
Si on modifie pendant l'exécution d'un "func" les classes par défaut, les masques, les fichiers ouverts ou les boîtes de dialogue, il est impératif d'utiliser pour ce faire les instructions Local Mask, Local File, ou Local ...Box. En effet, les instructions Mask, File et ...Box influent sur les OBJets ouverts, ce qui pose des problèmes au retour du "func".
Un "func" peut s'appeler récursivement, le nombre de "func" imbriqués n'est pas limité mais il faudra faire attention à la mémoire disponible, aux nombre d'OBJets ouverts et, en particulier, au nombre de fichiers ouverts en mode Local car chaque fonction est vu comme indépendante.
Attention, le fonction func ne peut pas être utilisée dans une clause Where.
Erreur | Description |
PAFIC (20) | Traitement inexistant. |
ERDIM (55) | Nombre de dimensions incorrect. |
ERARGNO (69) | Nombre d'arguments déclarés dans Funprog ne correspondant pas au nombre passé en func. |
ERARGTY (70) | mode de passage incompatible. |
ERLAB (39) | fonction inexistante. |
ERMODE (10) | exp_nomtrt n'est pas une chaîne de caractères. |