RPGの命令語に、ENDxxがあります。これは、必ず、対になる命令コードを持っていて、その命令コードを開始として、その終了部分を指定するのがENDxxです。昔は、どんな場合もENDしか無かったのですが、その後追加されて、ENDCS、ENDDO,
ENDIF, ENDSLが追加されました。
| コード |
対になる開始の命令語 |
条件標識 |
演算2 |
| END |
CASxx、DO、DOUxx、DOWxx、IFxx、またはSELEC |
DO,DOU,DOWの終結の場合のみ可能 |
DOの終結の場合のみ増分値 |
| ENDCS |
CASxx |
不可 |
|
| ENDDO |
DO |
可能 |
増分値 |
| DOUxx、または DOWxx |
可能 |
|
| ENDIF |
IFxx |
不可 |
|
| ENDSL |
SELEC |
不可 |
|
たとえば、指定の仕方は、以下のようになります。
B001 C *IN80 IFEQ *OFF
001 C MOVE COLOR W1OLDC
001 C MOVE *ON *IN80
E001 C END
C*
B001 C COLOR IFNE W1OLDC
001 C EXCPT#TOL
001 C Z-ADD0 O1CNT 50
001 C MOVE COLOR W1OLDC
E001 C ENDIF
|
このように、ENDでも、ENDxxでも、どちらでもコンパイルエラーにはならないのですが、そのソースを見やすく、また、構造化を強調して、ENDxxを付けています。DOやIFも、ネストレベルが深くなると、このENDが何のENDか分からなくなることがあります。また、作っているときに、勘違いしている場合もあり、コンパイルで重大度20を出す場合もあります。ENDだけだと、漠然としていたものが、ENDIFとすると、「このENDはIFの終結」、「このENDはDOの終結」と明確になります。
nestは、英語で「巣」または「入れ子型の箱(大きい箱の中に、一回り小さな箱を入れている状態)」の意味があります。コンピュータ言語では、ネストと言えば、「入れ子型の箱」を意味します。下の絵を見て下さい。IF-ENDIF
(1)の中に、IF-ENDIF (2)とIF-ENDIF (5)が入っていて、さらに、IF-ENDIF
(2)の中にDO-ENDDO (3)が入っています。さらにDO-ENDDO
(3)の中には、IF-ENDIF
(4)が入っていますね。あたかも、一番大きなIF-END(1)の箱の中に、一回り小さなIF-END(2)の箱が入っている見たいですね。この状態をネストもしくはネスティングといいます。また、IFで出来るネストをIFネストともいいます。でも、DOの場合はDOループとよく言います。
RPGでは、このネストは100個まで可能です。でも、だからといって、100個も立て続けにネストするプログラムを作る人はいません。というより、そんなことして欲しくないです。あまり、ネストが深くなると、わかりにくくなるのです。
上の例でも分かるように、一つのネストの箱は、IFと対応するENDIF,
DOと対応するENDDOで構成されます。このペアはとても大切です。論理そのものに影響します。
この例では、コンパイルはとおります(コンパイルは成功します)。DO-ENDDOの中に、IF-ENDIFが入っています。
B001 C COLOR DOWEQW1OLDC
B002 C *IN80 IFEQ *OFF
002 C MOVE COLOR W1OLDC
002 C MOVE *ON *IN80
E002 C ENDIF
E001 C ENDDO
|
この例では、コンパイルはとおりません(コンパイルは失敗します)。ENDIFとENDDOが逆になっています。「DO-ENDIF」や「IF-ENDDO」は、エラーなのです。
B001 C COLOR DOWEQW1OLDC
B002 C *IN80 IFEQ *OFF
002 C MOVE COLOR W1OLDC
002 C MOVE *ON *IN80
E002 C ENDDO
E001 C ENDIF
|
こんな短いプログラムでミスする人はいないでしょうが、実際のプログラムだと、長くなり、また気が付かなかったりしますよね。なるべく、ENDxxにして、コンパイラに検査させて、ロジックのミスを減らした方がいいでしょう。