Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Structures de contrôle

END

Fermer un groupe IF, DO, DOW, DOU, SELEC ou CAS

Termine le groupe ouvert en dernier ; ENDIF, ENDDO, ENDSL et ENDCS sont des variantes qui doivent correspondre au groupe fermé.

Syntaxe

     C                     END
     C                     ENDIF
     C                     ENDDO
     C                     ENDDO2
     C                     ENDSL
     C                     ENDCS
Code opération (28-32)
END ferme n'importe quel groupe. ENDIF ne ferme qu'un IFxx, ENDDO un DO, DOWxx ou DOUxx, ENDSL un SELEC, ENDCS un groupe CASxx.
Facteur 2 (33-42)
Utilisé seulement sur le END ou le ENDDO d'un DO : c'est l'incrément de l'indice (1 si absent). Voir la fiche DO.
Effet
Aucun indicateur n'est positionné. Pour un IFxx ou un SELEC, l'exécution continue après le END. Pour un DOWxx, un DOUxx ou un DO, le END renvoie au test ou à l'indice ; la boucle s'arrête quand sa condition le décide.

À quoi ça sert

En RPG III il n'y a ni accolade ni bloc délimité : chaque IFxx, DO, DOWxx, DOUxx, SELEC et groupe CASxx se ferme par un END. Un END ferme toujours le groupe le plus récemment ouvert, ce qui permet les imbrications (premier exemple).

Le compilateur RPG/400 accepte aussi les formes nommées ENDIF, ENDDO, ENDSL et ENDCS, qui rendent un long programme plus lisible : on voit d'un coup d'œil ce que ferme chaque ligne (deuxième exemple).

Exemple 1 : Un END par groupe, du plus récent au plus ancien

     H*  END : un END ferme le groupe ouvert en dernier (IF, DO, DOW)
     C                     Z-ADD1         N       10
     C           N         DOWLE3
     C           N         IFEQ 2
     C           'Deux'    DSPLY
     C                     END
     C*  Le END precedent a ferme le IF ; le dernier fermera le DOW
     C           N         DSPLY
     C                     ADD  1         N
     C                     END
     C           'Fin'     DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

1
Deux
2
3
Fin

Le premier END ferme le IFEQ (« Deux » ne s'affiche qu'au tour 2), le second ferme le DOWLE. Le programme affiche 1, Deux, 2, 3 puis Fin.

Exemple 2 : ENDIF, ENDSL, ENDDO

     H*  END : variantes ENDIF, ENDDO, ENDSL, ENDCS, qui doivent correspondre
     C                     Z-ADD1         N       10
     C                     DO   2         I       10
     C           N         IFEQ 1
     C           'Un'      DSPLY
     C                     ENDIF
     C                     SELEC
     C           I         WHEQ 2
     C           'Tour 2'  DSPLY
     C                     OTHER
     C           'Tour 1'  DSPLY
     C                     ENDSL
     C                     ENDDO
     C           N         DOWLE2
     C                     ADD  1         N
     C                     ENDDO
     C           N         DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Un
Tour 1
Un
Tour 2
3

Chaque groupe est fermé par sa forme nommée : ENDIF pour le IFEQ, ENDSL pour le SELEC, ENDDO pour le DO puis pour le DOWLE.

Le piège

Les formes nommées doivent correspondre au groupe. Un ENDDO placé sous un IFEQ est refusé : QRG5248, gravité 20, « Opération ENDxx hors séquence. » Il en va de même d'un ENDSL ou d'un ENDCS sous un IFxx (essais faits avec les trois). ENDIF sous un IFEQ est accepté.

Un END manquant arrête la compilation : QRG5177, gravité 30, « L'opération ENDxx n'est pas définie pour le groupe d'opérations DO, DOUxx, DOWxx, IFxx ou SELEC. » La ligne signalée est la fin du programme, loin du IFxx oublié : comptez vos groupes.

En RPG ILE full free

En RPG ILE full free, chaque structure a sa fin propre, obligatoire : ENDIF, ENDDO, ENDFOR, ENDSL, ENDMON.

if n = 1;
  dsply 'Un';
endif;
dow n <= 2;
  n += 1;
enddo;