Aller au contenu

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.