最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

17.20.フラグ=旗=標識

[ Previous ] [ HOME ] [ Upper ] [ Next ]


標識って何?

RPGのc仕様書の中に「標識」という言葉が出てきます。これは、

「プログラムの内部で、オンかオフかで、動きの制御をする為の特殊なフィールド」

のことです。RPG独特の機能です。

フラグとは、flag(旗)のことで、「データにつけくわえられて、それについての情報を与える追加部分」(コンピュータ用語辞典;Blue Backs)です。まあ、データの状況を表す部分です。「フラグ」という言葉を、プログラマーは、よく使います。でも、割合と漠然とした意味で使います。そうですね、「フラグ」って、プログラムの動きを制御する小さなデータのこと、というところかなぁ?結構、改まって考えると、ややこしいものですね。

RPGでは、この標識は、次のごとくに、コーディングしていきます。

  • 01,02,03,04,05,....95,96,97,98,99の様に、数字2桁の標識(00は無い)

  • L0,L1,L2,....L8,L9,の様に、「L(Level)」+数字1桁(0から9);制御レベル標識と呼びます
    (L0は特殊で、レベル0標識と呼ばれます。今は、あまり使われませんが、念のため掲げておきます。ずっとオンになったままです。)

  • 特殊な標識LR(Last Record ; Levelではない)の標識

  • さらにOFなどの、オーバーフロー標識

その他あり...

これらは、

c仕様書の中で記述される部分により、「制御レベル」、「条件標識」、「結果の標識」の3種類に分かれます。

たとえば、L1という標識も、有る場合は、「条件標識」となり、ある時は「制御レベル標識」となります。

注意

「条件標識」は、全ての標識が、成る事が出来ますが、「制御レベル」になることが出来るのは、L1からL9だけです。そこで、このL1からL9を、「制御レベル標識」とも言います。ややこしいですね。C仕様書の中で、書き込む欄を「制御レベル」と呼び、書き込まれる標識を「制御レベル標識」と呼びます。(少なくとも、マニュアルはそのように呼んでいます。)

標識の2つの状態(オンとオフ)の指定;「~がオンだったら、オフだったら」

この標識は、オンとオフの2種類の状態が有ることを、理解して下さい。

「オンだったら、このようにする」、「オフだったら、このように動く」、とプログラムの中で定義する事で、「条件分岐」をしていくのです。

下図を見て下さい。標識90が、オンの時とオフの時で、実行している内容が、分かれていますね。条件により、ロジックが分岐していますね。

indflow.gif

さて、今、お話ししたように、RPGでは、標識というと、3種類あります。

  1. 「条件標識」

  2. 「制御レベル」

  3. 結果の標識

です。暗記して下さい。ここでは、最初の2つに注目します。なぜなら、RPGサイクルに、大きく関与しているのが、「条件標識」と「レベル標識」だからです。

標識のコーディング例

     H            Y/                                    1
     FBALLP   IP  E           K        DISK
     FQPRINT  O   F     132     OF     PRINTER
     IBALLR       01
     I                                              COLOR L1
     C                     ADD  1         O1CNT   50       
     C*                                                    
     C   OF                EXCPT#HED                       
     C                     EXCPT#DTL                       
     CL1                   EXCPT#TOL                       
     CLR                   RETRN                           
     C*
     C           *INZSR    BEGSR                           
     C                     TIME           O1TIME  60       
     C                     EXCPT#HED                       
     C                     ENDSR                           
     OQPRINT  E  101           #HED
     O                                    1 'H'
     O                                   26 'NUMBER OF BALLS BALLR4'
     O                                   43 '実行日付:'
     O                         UDATE Y   52
     O*
     O        E  1             #HED
     O                                    1 'H'
     O                                   43 '実行時間:'
     O                         O1TIME    52 '0 :  :  '
     O*
     O        E  1             #DTL
     O                                    1 'D'
     O                         COLOR     10
     O*
     O        E  1             #TOL
     O                                    1 'T'
     O                         O1CNT JB  20

条件標識の例

さて、この明細サイクルで部分で使われる、標識で、左側から9カラムくらいに有るものを、「条件標識」といいます。上の例では、     

     C   OF                EXCPT#HED                             

のOFが「条件標識」です。記述された行を、実施するか、否かを制御していますね。上の例を、日本語で言うと、

標識OFがオンだったら、例外出力、#HEDを行う。

となります。もし、OFFの時にしたいならば、

     C  NOF                EXCPT#HED                              

と指定します。Nは否定のNotのNです。上の例を、日本語で言うと、

標識OFがオフだったら、例外出力、#HEDを行う。

となります。(実際では、あまり、オーバーフローがオフの時、という指定は無いですけど...)

制御レベルの例

同じソースの中で、

     CL1                   EXCPT#TOL                              

のL1が、制御レベルです。この記述部分は、仕様書のコードCの直後ですね。重要なのは、RPGで、この部分にL1とか、L2とか記述すると、それは「合計演算」の時にして欲しい事を記述していることになります。そうです。「明細演算」と「合計演算」との区別は、Cの隣にLxが無ければ「明細演算」、Cの隣にLxが有ると「合計演算」となります。このコーディングを日本語で表現すると、

合計演算の時(キーブレイク発生したら)L1がオンだったら、例外出力、#TOLを行う。

となります。

また、この制御レベルで「L1がオフだったら」を記述する方法はありません。もし、「制御レベルでNot L1」ということは、つまり、「合計演算では何もしないで、スキップして、明細演算で何かをする事」になります。だから、この場合、何も記述しないで、明細演算部分で、動作を記述すれば良いことになります。

その他の条件標識の指定の仕方

     C  N95                ADD  1         RRN01
     C  N95                WRITESFL01                                   

これは、95がオフの場合は、RRN01に数字を+1しています。さらに、95がオフの場合は、SFL01を書き出しています。もし、95がオンの場合は、この2つの処理はしません。(このRRN01に数字を加算したり、SFL01を書き出したり、なんて事の意味はまだ気にしないで下さいね。)このコードと同じ動きをする指定方法が、他にもあります。

     C           *IN95     IFEQ *OFF            
     C                     ADD  1         RRN01 
     C                     WRITESFL01           
     C                     END                                          

これは、*IN95が*OFFと同じ場合は、RRN01に数字を+1しています。その後、SFL01を書き出しています。もし、*IN95が*ONと同じ場合は、この2つの処理はしません。*ONと*OFFはこのあと、すぐに説明しますね。

この、*INxxという表現も、使われます。標識そのものは同じものですが、記述の仕方が異なっているだけです。つまり、

*INxxは、仕様書に記入するとき、条件標識の位置を使わず、演算項目1、命令語、演算項目2の位置に記入する方法で使われます。

N95は、*IN95 IFEQ *OFFとして、表記出来るわけです。

さらに、

     C  N95                DO
     C                     ADD  1         RRN01 
     C                     WRITESFL01           
     C                     END                                    

という、表記もできます。でも、あまり最後の方式(DO文)は、使われていません(日、米ともに)。まあ、ここでは、条件標識を理解してもらえれば、良いですので、どれがいいの、悪いの、は、ここでは取り上げません。あなたの会社の先輩に聞いてみて下さい。まずは、どれか一つの指定方法を学んで下さい。

*INのバリエーション

*INの形式はよく使います。これらは、演算項目1、または、演算項目2、または、結果のフィールドで、使います。7 〜 8桁の制御レベル標識や9 〜 17桁の条件付け標識、そして54 〜 59桁の結果の標識では、*INの形式で指定はできません。この他の例を上げますと、

制御レベル、条件付け標識、結果の標識 演算項目1、演算項目2、結果のフィールド
01 - 99 (条件付け標識、結果の標識) *IN01 - *IN99 (*INXXは配列ではない)
*IN,01 - *IN,99 (*INは配列である)
L1 - L9 (制御レベル標識,条件付け標識、※結果の標識) *INL1 - *INL9
OF (条件付け標識、結果の標識) *INOF
U1 - U8 (条件付け標識、結果の標識) *INU1 - *INU8
KA - KN、KP - KY (条件付け標識、※結果の標識) *INKA - *INKN, *INKP - *INKY
LR (条件付け標識、結果の標識) *INLR

この他にもありますが、今の段階ではこんなところを覚えておきましょう。これは、あくまで、表記方法が2種類あって、各々がc仕様書の中で、使われるところがちがうのだよ、よ言っているだけです。表の中で※は、指定できるけど、普通は使わないものです。たとえば、L1を結果の標識で、変更してしまうことはしません。

もし、全ての標識を見たい方は、RPG標識の一覧を見て下さい。

形象定数:*ONと*OFF

ここで、皆さんに覚えて欲しいプログラム上の、約束事があります。

オンの標識状態 = 標識内部の値は文字タイプの 1 = *ON

オフの標識状態 = 標識内部の値は文字タイプの 0 = *OFF

これは、理屈では無く、暗記して下さい。たとえば、95という標識が、オンの場合、その特殊なフィールドには、「1」が入っていて、オフの場合は、「0」が入っています。これを記述するとき、'1'でも良いし、*ONでも良いのです。'0'でも良いし、*OFFでも良いのです。*ONや*OFFは、形象定数です。(まあ、予約語みたいなものです。コンパイラーがプログラマーの為に準備した、定数です。)

したがって、先ほどの例を、下のように、書くことが出来ます。

     C           *IN95     IFEQ *OFF            
     C                     ADD  1         RRN01 
     C                     WRITESFL01           
     C                     END                            

と、

     C           *IN95     IFEQ '0'            
     C                     ADD  1         RRN01 
     C                     WRITESFL01           
     C                     END                            

は同じ事です。

ちょっと一言

IFEQは、「もし、~だったら」「ENDまでの処理をする」ということで、IF文は、必ず、END(またはENDIF)とペアで用いられます。このENDという命令語は、IFxxでも、SELECTでも、CASXXでも、DOxxでも使われますが、各々のENDのルールは、異なります。IFやSELECTやCASXXのENDには条件標識を付けられません(制御レベル標識は付けられる)が、DOxxでは、条件標識や制御レベル標識もつけられます。また、DOxxのENDは、増分値の指定があります...

まあ、細かいことですから、気が向いたら、RPGのマニュアルに当たってみて下さい。

起立、礼、着席

1999/4/10

 

[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送