RPG

378. 構造体の中にさらに構造体の配列を定義するには

構造体(=DS:Data Structure) の中にさらに構造体の配列を定義したい場合がある。
そのような複雑な構造の定義の方法を紹介する。

0338.00  **********************************                                                          
0339.00  *    HELP  構造体                *                                                          
0340.00  **********************************                                                          
0341.00 D OFSDFN          DS             8    QUALIFIED                             オフセット項目   
0342.00 D  OFF                    1      2B 0                                                        
0343.00 D  SPC                    3      8                                                           
0344.00                                                                                              
0345.00 D HELP_P          S               *                                                          
0346.00 D HELP_           DS          1024    BASED(HELP_P)                                          
0347.00 D                                     QUALIFIED                                              
0348.00 D  ID#                    1      1A                                        X'13'             
0349.00 D  SIZE                   2      3B 0                                                        
0350.00 D  SPACE                  4      6                                                           
0351.00 D  OFSR                               LIKEDS(OFSDFN) DIM(100)                 オフセット配列 
   :
   :
1344.00 C                   EVAL      ELEM = %ELEM(HELP_.OFSR)
1345.00 C     2             DO        ELEM          N                         
1346.00 C                   EVAL      BIN2C = %SUBST(WUIX:HELP_.OFSR(N).OFF:2)
   :
1373.00 C                   ENDDO

[解説]

構造体(=DS:Data Structure) の中にさらに構造体の配列を定義するには
構造体の中に LIKEDSキー・ワードを使ってさらに構造体を定義する。

最初に構造体: OFSDFNを次のように定義する。

0341.00 D OFSDFN          DS             8    QUALIFIED                             オフセット項目   
0342.00 D  OFF                    1      2B 0                                                        
0343.00 D  SPC                    3      8  

次にその構造体 : OFSDFN をOFSRという名前の配列で
親の構造体: HELP_ の中に定義する。

0346.00 D HELP_           DS          1024    BASED(HELP_P)                                          
0347.00 D                                     QUALIFIED
  :
0351.00 D  OFSR                               LIKEDS(OFSDFN) DIM(100)                 オフセット配列

ここでの注意として LIKEではなく必ず LIKEDSを使うこと。
LIKEでもコンパイルは通るがOFSRは文字として定義されてしまう。
必ず LIKEDS で定義すること。

さらに桁位置はブランクにしておいて定義してはならない。
そのためには

0350.00 D  SPACE                  4      6

などを挿入して位置を調整することが必要である。

配列の数は

1344.00 C                   EVAL      ELEM = %ELEM(HELP_.OFSR)

のようにして %ELEM を使って取得するようにしておくと配列数が増えても再コンパイルだけで済む。

1346.00 C                   EVAL      BIN2C = %SUBST(WUIX:HELP_.OFSR(N).OFF:2)

のようにして QUALIFIED で定義しているので
構造体の名前を使って HELP_.OFSR(N) のようにして配列指標Nによる表現が可能となる。

ここではデータ・ストラクチャー(構造体)を使う高度な利用方法を
紹介した。