自己学習メモインデックス
概要
IBM i (旧AS400)の自己学習メモ RPG Ⅳプログラミング編02 コンパイル時配列(CTDATAを使う)でCTDATAを使ったコンパイル時配列の初期化の記事を書きましたが、これはRPGの古い使い方?のようです。
CTDATAの調査をしている中で、やり方が分からないので別の方法に逃げようかなぁと思って探していたのが、この記事の方法です。
DS/INZ/OVERLAYを使ったコンパイル時配列の実現
以下サンプルコードです。
FMT * ..... *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Beginning of data **********************************************
0001.00 * コンパイル時配列用の変数定義
0001.02 D @@DSMODES DS
0001.03 D 6 INZ('登録')
0001.04 D 6 INZ('更新')
0001.05 D 6 INZ('削除')
0001.06 D @@MODES 6 DIM(3) OVERLAY(@@DSMODES)
0002.01 * インデックス変数
0002.02 D i S 1P 0 INZ(1)
0003.00 * コンパイル時配列の値を表示
0003.01 C FOR i = 1 to 3 by 1
0003.02 C @@MODES(i) DSPLY
0003.03 C ENDFOR
0006.00 * RPGの終了
0007.00 C EVAL *INLR = *ON
****************** End of data *************************************************
重要なのは以下の部分です。
-
D @@DSMODES DS
- DS:Data Structure(データ構造)という技術を使った構造体を定義
- 構造体には3つの要素(サブフィールド)を名前を付けずに定義し、初期値(INZ)として文字列を定義。
-
D @@MODES 6 DIM(3) OVERLAY(@@DSMODES)
- OVERLAYで構造体で定義した登録,更新,削除の各サブフィールドの値を、@@MODESの配列にオーバーレイ(重ねる)して配列を初期化しています。
- OVERLAYキーワードは、1 つのサブフィールドの記憶域に別のサブフィールド の記憶域、またはデータ構造自体の記憶域をオーバーレイ させます。という役割があるようです。
参考:https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_71/rzasd/sc092508551.htm
0001.00 * コンパイル時配列用の変数定義
0001.02 D @@DSMODES DS
0001.03 D 6 INZ('登録')
0001.04 D 6 INZ('更新')
0001.05 D 6 INZ('削除')
0001.06 D @@MODES 6 DIM(3) OVERLAY(@@DSMODES)
CTDATAを使うより、こっちの方が初心者には読みやすい気がします。
ただ、配列を初期化するのに、わざわざ別の変数を定義して、それをオーバーレイしなければ初期化できないとは、なんて不便な、、、
こんな風に1つにまとめられればいいのにと思いました。
var modes = ["登録", "更新", "削除"];