Code opération RPG III / RPG/400 · IBM i (AS/400) · Sous-programmes et appels
FREE
Libérer un programme appelé
Retire de la mémoire le programme indiqué en facteur 2 : le prochain CALL le rechargera à zéro, même s'il s'était terminé par RETRN sans LR.
Syntaxe
C FREE 'PROG' 56
C FREE nomzone 56
- Facteur 2 (33-42)
- Le nom du programme à libérer : un littéral ou une zone qui contient le nom, comme pour
CALL. - Indicateurs (56-57)
- Erreur : s'allume quand le programme demandé est introuvable.
- Effet
- Le programme libéré perd ses zones : l'appel suivant le recharge comme un premier appel (le compteur du deuxième exemple repart de 1). Le programme appelant continue sans autre effet.
À quoi ça sert
Un programme appelé en RETRN sans LR garde ses valeurs. Quand l'appelant veut le remettre à neuf (nouveau lot, nouvelle journée) sans changer le programme appelé, il le libère avec FREE. Cela rend aussi de la mémoire.
Exemple 1 : Le programme appelé
H* FREE : programme APPELE (a compiler sous le nom Z3FREE1)
C ADD 1 CPT 30
C CPT DSPLY
C RETRN
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
Un simple compteur qui s'affiche et se termine sans LR. À compiler sous le nom Z3FREE1.
Exemple 2 : Le compteur repart de 1
H* FREE : libere le programme appele, le compteur repart de 1
C CALL 'Z3FREE1'
C CALL 'Z3FREE1'
C FREE 'Z3FREE1'
C CALL 'Z3FREE1'
C CALL 'Z3FREE1'
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
2
1
2
Deux appels donnent 1 puis 2 (le programme garde son compteur). Le FREE libère le programme, et les deux appels suivants donnent de nouveau 1 puis 2.
Exemple 3 : Indicateur d'erreur
H* FREE : indicateur d'erreur 56
C FREE 'Z3FREE1' 56
C *IN56 DSPLY
C FREE 'ABSENT1' 56
C *IN56 DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
0
1
Après un FREE d'un programme qui existe, le 56 reste éteint (0). Avec un programme inexistant, il s'allume (1).
Le piège
Sans FREE ni LR, le programme appelé garde ses valeurs. Dans le deuxième exemple, sans la ligne FREE, les quatre appels afficheraient 1, 2, 3 puis 4. C'est l'appelant qui décide de libérer ; le programme appelé n'en sait rien. Si l'appelé met lui-même LR en fin de travail, le FREE est inutile.
L'indicateur 56 sert aux noms qui varient. Un FREE sur un programme existant laisse le 56 éteint ; sur un programme inexistant il s'allume (troisième exemple). Le nom peut être donné dans une zone, comme pour CALL.
En RPG ILE full free
Il n'existe pas d'instruction équivalente en RPG ILE. On termine le programme appelé par *inlr = *on avant return, ou l'on libère un groupe d'activation tout entier avec la commande CL RCLACTGRP.