RPG

92. 配列オーバーを検査するには?

作業用の内部配列を十分と思われる要素数を用意しておいても時には予想できない
配列の要素数のオーバーが発生することがある。

CPFエラーでは配列の指標のエラーと報告されるだけで、どの配列がオーバーしたのかを
ユーザーから開発者に知らせることはできない。
ここでは %ELEM を使って配列指標がオーバーしそうになったときにDSPLY命令によって、
ユーザーに通知する方法を紹介する。
作業用の配列を多数使用しているRPG では、非常に役に立つ手法である。

配列 FDR は次のように512項目の要素を持つ配列として定義されているとする。

D FDR             S             10    DIM(512)
D AR              S              1    DIM(112)
D MSR             S             80    DIM(1) CTDATA PERRCD(1)
                          :

次の演算では配列指標の増分の妥当性を %ELEM によって検査してオーバーするようで
あれば、エラー・メッセージを表示してPGMを直ちに終了する。%ELEM によって検査して
いるので配列の要素数を変更しても演算命令を変更する必要はない。

C*   フィールド情報を保管                                        
CSR   HMFMT         IFEQ      '1'                                
CSR                 ADD       1             FD                   
C                   IF        FD > %ELEM(FDR)                    
C                   MOVE      FD            ARYSU             4  
C                   MOVEL     'FDR   '      ARYNAME           6  
C                   EXSR      OVRARY                             
C                   END                                          
                          :
2747.00 C******************************************************                
2748.00 C     OVRARY        BEGSR                                              
2749.00 C******************************************************                
2750.00 C                   MOVEL     MSR(1)        ERRMSG                     
2751.00 C                   MOVEA     ERRMSG        AR                         
2752.00 C     'YYYYYY'      SCAN      ERRMSG:1      N                        50
2753.00 C   50              MOVEA     ARYNAME       AR(N)                      
2754.00 C     'XXXX'        SCAN      ERRMSG:1      N                        50
2755.00 C   50              MOVEA     ARYSU         AR(N)                      
2756.00 C                   MOVEA     AR            ERRMSG                     
2757.00 C                   MOVEL     ERRMSG        DSP50            50        
2758.00 C     DSP50         DSPLY                   ANS               1        
2759.00 C                   SETON                                        LR    
2760.00 C                   RETURN                                             
2761.00 CSR                 ENDSR
                          :
**      MSR  -- 以下は配列  -- 
 変換用の配列 YYYYYY の数 XXXX がオーバーです。