永年、RPGに携わってきた開発者であれば 01- 99
の標識を扱うのには慣れているし、
違和感も無いと思うが、最初に RPG に触れた人であれば標識の概念に戸惑う場合が多い。
ユーザーに提供された *IN01 〜 *IN99
のブール値であるという理解は得られても
他の言語であれば、このようなブール値にはユーザー指定の任意の名前を与えることができるので、
名前によるブール値に慣れている場合は 01 - 99
の無気質な数値では記憶にも残りにくいし、
感覚的に慣れにくいのである。
そこで RPG の場合でもフィールドを標識の代用にするのではなく、標識そのものに名前をつけて
扱える方法をここで紹介しよう。
この方法には大別して2つの方法がある。
0001.00 D INDICATORS DS BASED(INDPTR) 0002.00 D NOT_FOUND 88 88 0003.00 D CHAIN_ERR 90 90 0004.00 D INDPTR S * INZ(%ADDR(*IN)) 0005.00 0006.00 C SHKEY CHAIN SHOHIN 90 0007.00 C IF CHAIN_ERR = *ON : 0009.00 C END
データストラクチャー INDICATORS
は INDPTR
というポインタを基底とするフィールドであり、
ポインタ INDPTR
は %ADDR(*IN)
として初期設定されているので標識 01 - 99
の
標識バッファーを指している。
したがって CHAIN_ERR
とは標識バッファーの 90番目であるので *IN90
と同じ値が常に入る。
これによって *IN90
の代わりに CHAIN_ERR
という名前を使用することができるように
なったのである。
既存の RPGソースを修正する場合に新規に標識を定義したいのだが、
既に使用済みの標識と重ならないようにしなければならない場合がある。
こんなときにコンパイル・リストを丹念に調査して未使用の標識を探しだす必要はない。
次の方法によって勝手に(?) 好みの名前を名前による標識を定義することができる。
0001.00 D @EOF S 1N INZ(*OFF) 0002.00 D @FOUND S 1N INZ(*OFF) 0003.00 0004.00 C EVAL @EOF = READ_CHANG('G2SFL') 0005.00 C DOW NOT @EOF 0006.00 C MOVEL '1' #FG(RRN2) 0007.00 C EVAL @EOF = READ_CHANG('G2SFL') 0008.00 C ENDDO
この RPG ソースは EnterpriseServer Ver4.0 の TONAKAI によって移行された
CGI ソースの一部を抜粋したものである。
標識 @EOF
と @FOUND
は
0001.00 D @EOF S 1N INZ(*OFF) 0002.00 D @FOUND S 1N INZ(*OFF)
によって定義されている。1桁のタイプ N
が標識であることを意味している。
0005.00 C DOW NOT @EOF
がコンパイル・エラーにもならずに正しく標識としてコンパイラーにも認識されている。
%EOF
や %FOUND
はユーザーでは設定することができないので TONAKAI による移行では
@EOF
や @FOUND
などのユーザー定義による標識に置き換えられているのである。