| Objet : | Exécuter un sous-programme dans le fichier batch courant |
| Format : | GOSUB ["filename"] label [variables] |
| filename | Le fichier contenant le sous-programme |
| label | L'étiquette du fichier batch au début du sous-programme. |
| variables | Variables GOSUB optionnelles. |
Voir aussi : CALL, GOTO et RETURN.
Syntaxe de complétion de fichier :
La syntaxe de complétion de nom de fichier par défaut est la suivante : [1] dirs btm cmd bat [2*] *
Utilisation :
GOSUB ne peut être utilisé que dans les fichiers batch.
TCC autorise les sous-programmes dans les fichiers batch. Un sous-programme doit commencer par uneétiquette (deux points [:] suivis d'un nom d'étiquette) qui apparaît seule sur une ligne et ne peut pas être incluse dans un groupe de commandes. Les différences de majuscules et de minuscules sont ignorées lors de la comparaison des étiquettes. Le sous-programme doit se terminer par une instruction RETURN.
Le sous-programme est invoqué par une commande GOSUB à partir d'une autre partie du fichier batch. Après l'instruction RETURN, le traitement se poursuit avec la commande qui suit l'instruction GOSUB. Par exemple, le fragment de fichier batch suivant appelle une sous-routine qui affiche le répertoire et renvoie :
echo Calling a subroutine
gosub subr1
echo Returned from the subroutine
quit
:subr1
dir /a/w
return
GOSUB commence à rechercher l'étiquette sur la ligne du fichier batch qui suit immédiatement la commande GOSUB. Si l'étiquette n'est pas trouvée entre la position actuelle et la fin du fichier, GOSUB recommence la recherche au début du fichier. Si l'étiquette n'est toujours pas trouvée, le fichier batch se termine avec le message d'erreur "Label not found".
Vous pouvez définir desvariablesGOSUB en les plaçant après le nom de l'étiquette sur la ligne GOSUB. Par exemple, les noms des variables sont définis sur l'étiquette :
Gosub Sub1 abc 15 "Hello World"
Les noms des variables sont définis sur la ligne de l'étiquette. Par exemple : Le nom des variables est défini sur la ligne de l'étiquette :
:Sub1 [str n world]
définittrois variables - %str (fixée à "abc"), %n (fixée à 15) et %world (fixée à "Hello World"). Notez que les crochets sont obligatoires sur la ligne d'étiquette. Les variables GOSUB ne sont définies que pour la durée du sous-programme. Elles ne sont pas héritées par les GOSUB imbriqués et sont détruites par l' appel RETURN.
Si vous ajoutez un * au dernier nom de variable de la liste de paramètres sur la ligne d'étiquette, cette variable sera "gourmande" et toutes les variables restantes lui seront attribuées. Par exemple :
gosub sub1 one two three four five
...
:sub1 [arg1 arg2 arg3*]
arg3 se verra attribuer "three four five".
Si vous définissez des variables GOSUB sur l'étiquette mais que vous ne les fournissez pas sur la ligne GOSUB, elles prendront la forme d'une chaîne vide.
Lesappels GOSUB avec variables sont limités à un maximum de 22 niveaux de profondeur. Il n'y a pas de limite pour les appels GOSUB normaux.
Les variables GOSUB sont placées dans l'environnement sous une forme spéciale pour la durée de la sous-routine et "masquent" toutes les variables d'environnement du même nom qui existaient avant l'appel de la sous-routine. Lesvariables GOSUB peuvent être référencées comme des variables d'environnement normales, mais elles ne sont pas stockées de la même manière, ne peuvent pas être modifiées avec les commandes SET, ESET ou UNSET et ne peuvent pas être utilisées avec le test DEFINED de IF, IFF ou @IF.
Vous ne pouvez pas utiliser la commande SET dans un sous-programme pour modifier la valeur d'une variable GOSUB. Si vous tentez de le faire, la commande SET définira la variable d'environnement standard du même nom, et non la variable GOSUB, mais cette valeur sera "masquée" par la variable GOSUB et restera inaccessible jusqu'à la fin du sous-programme.
Vous pouvez appeler une sous-routine dans un autre fichier en spécifiant le nom du fichier (le nom doit être placé entre guillemets). Cela vous permet de créer des bibliothèques de sous-programmes, sans avoir à les dupliquer dans chaque fichier batch. Par exemple :
gosub "c:\library\batlib.btm" Evaluate [%1 %2 %3]
GOSUB enregistre les états IFF et DO, de sorte que les instructions IFF et DO à l'intérieur d'un sous-programme n'interfèrent pas avec les instructions de la partie du fichier batch à partir de laquelle le sous-programme a été appelé. Si le sous-programme a exécuté un SETLOCAL sans ENDLOCAL correspondant, un ENDLOCAL sera exécuté avant de retourner au fichier batch appelant.
Vous ne pouvez pas RETURN d'un GOSUB à l'intérieur d'une boucle DO.
Si TCC atteint la fin du fichier batch alors qu'il se trouve à l'intérieur d'un sous-programme, il reviendra automatiquement à la commande qui suit le GOSUB, comme si une commande RETURN explicite avait été incluse dans la dernière ligne du fichier.
Les sous-programmes peuvent être imbriqués.
Voir aussi : fonctions définies par l'utilisateur.