0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

IBM i (旧AS400)の自己学習メモ RPG Ⅳプログラミング編03 コンパイル時配列(DS/INZ/OVERLAY)

Posted at

自己学習メモインデックス

IBM i (旧AS400)の自己学習メモ インデックス

概要

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 = ["登録", "更新", "削除"];
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?