Lors de la modernisation des programmes de RPG colonné vers du free form, nous sommes confrontés à la disparition du code opération MOVEA pour la manipulation des tableaux.

Cet article rappelle des solutions pour initialiser un tableau sans boucle.

Si vous devez initialiser l’ensemble du tableau :

Vous disposez de plusieurs possibilités :

  • Initialisation du tableau
    Comme toute variable, vous pouvez initialiser votre tableau au niveau de la déclaration, mot clé INZ.
                  

Cette méthode fonctionne aussi bien avec des tableaux de variable comme dans l’exemple, qu’avec  des tableaux de DS. Dans ce second cas, il faudra initialiser les éléments de la DS :

   

Attention, si vos programmes se terminent par return, vos variables restent chargées en mémoire. L’initialisation n’est pas refaite, tant que les ressources de votre groupe d’activation ne sont pas récupérées, lors des appels suivants :

1er appel :  Initialisation et modification du poste 3

     

2ième appel  : Valeur dès l’entrée dans le programme, le poste 3 est toujours à ZZ

  • Remise à blanc du tableau

Si vous voulez initialiser votre tableau sans valeur particulière, vous pouvez utiliser le code opération CLEAR.
Les valeurs seront attribuées en fonction du type de la variable, blanc pour les alpha, 0 pour les numériques, off pour les booléens…


Valeur de la DS avant Clear                                                      vs           Valeur de la DS après Clear

      

Cette méthode oblige à explicitement initialiser les variables dans le code, mais elle a le mérite de fonctionner aussi bien avec des programmes en  *INLR que des programmes en return.

  • Recharger les valeurs d’initialisation

Par le code opération RESET, vous allez pouvoir réattribuer les valeurs d’initialisation INZ à votre tableau.

Valeur de la DS avant Reset                                                     vs           Valeur de la DS après Reset

              

Cette méthode a l’avantage de pouvoir attribuer des valeurs distinctes à mes différentes variables et de pouvoir réinitialiser à tout moment.
Si vos programmes sont en mode return, et vos variables avec des valeurs d’initialisation, vous devrez utiliser le code opération RESET en début de traitement.

Si votre déclaration ne contient pas de valeur d’initialisation, pas de INZ, le code opération RESET revient à faire un CLEAR, mais dans ce cas là autant faire un CLEAR !

  • *all + chaine de caractères / *allX + code hexa

Vous avez aussi la possibilité d’utiliser la fonction *all. Attention à la réaction de cette fonction selon le type de variable… Et leur longueur !
Je ne détaillerai pas cette possibilité qui peut engendrer rapidement des erreurs d’initialisation voir des plantages.
Les méthodes vues précédemment offrent les mêmes possibilités sans les risques.

Si vous devez n’intervenir que sur une partie de tableau :

Vous pouvez utiliser les mêmes méthodes vues précédemment, en ajoutant la fonction intégrée %SUBARR sur votre tableau.

Pour rappel, cette fonction offre deux possibilités :

  • %SUBARR(MonTableau : Indice) : prend en compte mon tableau depuis l’indice passé jusqu’au dernier indice du tableau
  • %SUBARR(MonTableau : Indice : NbElem) : prend en compte mon tableau depuis l’indice passé pour le nombre d’éléments déterminés

Reprenons notre exemple, avec un tableau initialisé par la déclaration.

L’utilisation de %SUBARR, avec le code opération CLEAR, va réinitialiser uniquement des postes du tableau concerné :

  –> A partir du deuxième poste pour 3 postes, soit les indices 2, 3 et 4 seront réinitialisés.

Tableau avant CLEAR                                                      VS             Tableau après CLEAR

                    

De la même manière, on peut utiliser %SUBARR avec RESET :

–> A partir de l’indice 3 du tableau les valeurs d’initialisation seront rechargées, les indices 1 et 2 seront inchangés.

Tableau avant RESET                                                      VS             Tableau après RESET

                       

Les indices 1 et 2 n’ont pas été modifiés.