コンパイル時配列 (ILE RPG)

RPG で配列を扱う場合に、"実行時配列"と"コンパイル時配列"という言葉がでてくることがあります。

それぞれどういうものかの詳しいことはマニュアルを見ていただくとして、コンパイル時配列はプログラムの中で設定してしまう一群の定数ですね。
わざわざファイルにするほどでもない少量の参照用データなどが使われます。「コンパイル時定数」のようなものでしょうか。


"トラディショナル"な書き方

まず最初にコーディング例です。

D 仕様書に配列の定義があり、一番下にある "**"で始まる行がその配列に格納されるデータの内容と名前になっています。

たとえば、"JulianDays" という 3桁の数字が 12個がある配列について、"CTDATA" というところに 12個分内容が記述されている、というのが最初の D 仕様書の行の定義の内容です。
"**CTDATA JulianDays" の次の行に"000031059090120151181212243273304334"とありますが、これを 3桁づつ 12個に切って格納するわけです。

↓については、

     D MonthNames      S              9    Dim(12) CTData PerRcd(3)

↓を 12桁づつ区切って、一行 3つづつ記述されているのを取ってくる、という定義になりますね。

January  February March
April    May      June
July     August   September
October  November December

ちなみに、このコンパイル時配列の定義は IBM のどこかのサイトにあるコーディング例からそのまま取ってきました。

     D JulianDays      S              3  0 Dim(12) CTData PerRcd(12)
     D DeptNames       S             15    Dim(3) CTData
     D MonthNames      S              9    Dim(12) CTData PerRcd(3)

     D  i              S              5i 0

      /free

           for  i = 1 to %elem(JulianDays) ;
              dsply      %char(JulianDays(i)) ;
           endfor ;

           for  i = 1 to %elem(DeptNames) ;
              dsply           (DeptNames(i)) ;
           endfor ;

           for  i = 1 to %elem(MonthNames) ;
              dsply           (MonthNames(i)) ;
           endfor ;

           *inLR = *on ;
           return ;

      /end-free

**CTDATA JulianDays
000031059090120151181212243273304334
**CTDATA DeptNames
Fabulous Dept 1
Name of Dept 2
Good Old Dept 3
**CTDATA MonthNames
January  February March
April    May      June
July     August   September
October  November December

"モダン"な書き方

↑のはかなりトラディショナルな RPG でのコンパイル時配列の書き方ですが、初心者や RPG に慣れていない人にはあまりわかりやすいものではないように思います。(まぁわざわざ解説をしているくらいですから)

一般的によりわかりやすく、しかも結果がまったく変わらないように書き直したのが↓になります。(/free から /end-free) までのあいだはまったく同じです。書きかえたのは配列の定義とデータの部分だけになっています。

     DJulianData       DS
     D                               12    inz('000031059090')
     D                               12    inz('120151181212')
     D                               12    inz('243273304334')
     D JulianDays                     3  0 Dim(12) Overlay(JulianData)

     DDeptData         DS
     D                               15    inz('Fabulous Dept 1')
     D                               15    inz('Name of Dept 2 ')
     D                               15    inz('Good Old Dept 3')
     D DeptNames                     15    Dim(3) Overlay(DeptData)

     DMonthData        DS
     D                                9    inz('January')
     D                                9    inz('February')
     D                                9    inz('March')
     D                                9    inz('April')
     D                                9    inz('May')
     D                                9    inz('June')
     D                                9    inz('July')
     D                                9    inz('August')
     D                                9    inz('September')
     D                                9    inz('October')
     D                                9    inz('November')
     D                                9    inz('December')
     D MonthNames                     9    Dim(12) overlay(MonthData)

     D  i              S              5i 0

      /free

           for  i = 1 to %elem(JulianDays) ;
              dsply      %char(JulianDays(i)) ;
           endfor ;

           for  i = 1 to %elem(DeptNames) ;
              dsply           (DeptNames(i)) ;
           endfor ;

           for  i = 1 to %elem(MonthNames) ;
              dsply           (MonthNames(i)) ;
           endfor ;

           *inLR = *on ;
           return ;

      /end-free

読みやすい、というのはそのまま直しやすい、ということでもありますし、つまりは未来に向かってメインテナンスに耐えるコードになるわけですね。

意図も、またそれゆえに使い方の範囲などもわかりやすく、間違った使い方をするリスクを減らし、バグの原因を減らすことになります。また、読めないので直せない、といったようなことを減らすためには「一般的に」読みやすくすることも大事ですよね。何年も(何十年も?!) 中身を見られず書き直しもされないまま生きながらえているコードは「開かずの間」みたいなものではないのか?? いいのか?! というような意見もあるわけです。

いずれにせよ、必要があった時に直せるコードである、ということに異を唱える人はいないでしょう。RPG のプログラミング人口を減らさない(減らしすぎない)ためにもそれなりにモダンな書き方を取り入れていく必要はあるように思います。

[Top Pageに戻る]

Ads by TOK2