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

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

よく使うマニュアルです

Wiki

updated on 2004.06.23

17.8.RPGの基本(E;配列について)

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


今日の講義は、「配列」です。仕様書はE仕様書と主に、C仕様書が関係します。(i仕様書を使うこともあります。)E仕様書は、HFELICOのEですね。Extension Specificationsのことです。

E仕様書では、他の言語でいうところの、いわゆる、「配列の宣言」をします。(よく見ると、すごい言葉ですよね。でもそーゆーのです。「宣言」は Declarationのことです。)プログラムを作る人には。さけて通れない、というより、知らなければ、損をするテクニックです。

さて、最初に、配列そのものの概念を説明します。

配列の概念

BASICにも、コボルにも、どんな言語にも、「配列」はあります。プログラム固有の概念でしょう。「配列」とは、一般的には、もの並び方を指す言葉ですが、プログラムでは、

データを、番号のついた引き出しに一時保管できるプログラム内部の「変数」です。

※ 「変数」とは、プログラム内部で一時的に、数字や文字のデータを入れておく場所です。これがないと、プログラムは作れません。

この「番号」を、「指標」とか「添え字」とか呼びます。RPGでは、「指標」というのが一般です。(マニュアルで使われています)。指標は演算可能な数字です。(ここがポイント)

この配列はプログラムを実行するときに、メモリの一部を利用して、実行時に動的に参照されます。ですから、無駄に大きな配列はタブーです。繰り返しますが、配列そのものや、配列の操作は、オンメモリ(メモリ内)で行われます。プログラム外部のディスク上のオブジェクトを参照はしません。あくまでプログラム内部の「番号付き引き出し保管場所」です。

配列のイメージ

array.gif (5490 バイト)

上の、配列のイメージ図では、

配列要素の数は6つ。この配列は必ず名前が必要です。たとえば、上図の配列名を「NUM」ということにすると、

  • NUMの指標1の内容は   1,234
  • NUMの指標2の内容は   4,567
  • NUMの指標3の内容は -8,901
  • NUMの指標4の内容は        0
  • NUMの指標5の内容は        0
  • NUMの指標6の内容は        0

となります。

さらに、この配列は、「一次元配列」といいます。なにか1つのことが決まると、それに伴い1つの内容が決定されるのです。たとえば、指標=1と決まれば、内容=1234と決まります。これに対して、「二次元配列」は、なにか2つのことが決まると、それに伴い1つの内容が決定されるものです。たとえば、指標=(1、2)と決まったら、内容=Wと決まるような場合です。

一次元配列の例。

「国語のテスト」を引数として検索すると、70と決まる。

数学のテストの点 60
国語のテストの点 70
社会のテストの点 55

プログラムの配列では、上記の例の、数学のテストの点などを「指標」と考えれば、いいですね。たとえば、「数学のテストの点」を1、「国語のテストの点」を2、「社会のテストの点」を3、として、配列名を、PNTとすると、

  • PNTの指標 1 の値は 60
  • PNTの指標 2 の値は 70
  • PNTの指標 3 の値は 55

となります。

二次元配列の例。教養として...

「社会のテスト」だけでは、75,70,88と複数となり、一つになりませんね。「社会のテスト」かつ「山田君」と2つ決まって、75と決まります。

山田君 吉沢君 藤沢君
数学のテストの点 65 85 72
国語のテストの点 90 55 70
社会のテストの点 75 70 88

RPGでは、E仕様書で、直接指定できるのは、「一次元配列」のみです。「二次元」以降は使えません。

※ ただし、ある方法で、一次元を複数組みあわせて、「擬似的な」二次元配列を実現することは可能です。オカレンスを利用するのですが、中級のテクニックなので、今は、一次元の配列の習得を優先してください。

指標

指標は、1以上で配列の要素数以下までの数字が使えます。BASICは、指標0が使え、この指標0で特別な使い方をしたものですが、指標に0が使えるのはかなり特殊です。

RPG指標 0 は、では使えません。指標に0を指定するとRPGではエラーになります。

また、指標は数字の変数として、定義したり、これを演算した結果として、配列の内容を取り出すことも可能です(というより、この方が実践では多いです。)

なぜ配列を使うのか(メリットは何か)

自分の経験から言うと、次のようになります。

  • ファイルの内容を、配列に展開して(ロードして)おいて、ファイルのアクセスを減らして、実行効率をよくしたい場合。

あまりに多くのデータは、逆効果ですが、たとえば、「区分コード」から「区分名称」を取り出すなど、多くてもせいぜい10個ほど、なんてゆうときに、その「区分マスターファイル」をいちいち参照するより、実行速度が速いのです。

  • 繰り返し、同じ計算を似たようなフィールドにする場合、ロジックを簡略にしたい。

RPGでは、配列名を指標抜きで指定すると、配列全体を指定したのと同じになります。同じ数字の要素数を持つARY1とARY2があったとすると、
 
ARY3 = ARY1+ARY2 とすると、
  1. (ARY1の指標1の値) + (ARY2の指標1の値)の結果が ARY3の指標1 に入る
  2. (ARY1の指標2の値) + (ARY2の指標2の値)の結果が ARY3の指標2 に入る
  3. (ARY1の指標3の値) + (ARY2の指標3の値)の結果が ARY3の指標3 に入る
  4. (ARY1の指標4の値) + (ARY2の指標4の値)の結果が ARY3の指標4 に入る
  5. ...

例)

ARY1

2

3

4

+

+

+

ARY2

4

5

6

=

=

=

ARY3

6 8 10

となります。つまり、各配列の要素を一個一個しなくても、まとめてできますので、便利ですし、コードも少なくて済みます。また、指標をDOループで、ブン回すという方法もあります。いずれわかります。それから、配列内容が数字ならば、一発で合計を求めることも可能です。(XFOOTといいます。クロスフットです)

  • ルックアップ命令を使い、ロジックを簡略にしたい。

    ファイル参照命令では、キーの値の同じレコードを取り込む命令ですが、配列だと、オンメモリ(メモリ上で)内容の一致するものを検索して、その指標を取り出す、まあ、「逆引き」みたいなことができます。

テーブル(表)とアレイ(配列)

RPGでは、E仕様書で定義できるものが2つあります。テーブル配列です。

テーブル

テーブルは、2つの要素からなる、固定情報(よく、「レテラル」といいます)の参照用です。実行中に内容を書き換えることはできません。さらに、指標はありません。あくまで、「表」です。たとえば、テーブルの内容をあらかじめプログラム内部で定義しておいて、C仕様書などで、引数(ひきすう、と読みます。)を与えて、テーブル要素を取り出します。指標の代わりに、探索したい値が入っているようなものです。また、テーブルの内容は、ファイルから取り出してセットすることも可能です。F仕様書の「ファイルの指定」にTをセットして、E仕様書にそのファイル名を「取り出しファイル名」にセットすれば、初期ルーチンでファイルを勝手に読み込んで、テーブルにセットしてくれます。

ひとつ、ルールがあり、テーブルの場合は、名前をTABで始めなければなりません。また、遅くとも、プログラム実行までには、内容が確定してなければならないことはおわかりですよね。

例)

販売額(TABAMT) 割引率(TABRAT)
0 0
10,000 0.05
30,000 0.10
60,000 0.20
100,000 0.50

ここで、C仕様書で、TABAMTに11,000を引数として、TABAMTで検索をすると、TABRATには0.05が取り出されます。つまり、10,000から29,999は0.05が返されるのです。これで、指標が出てこないわけわかるでしょう?このテーブル、RPG独特のものです。

配列(添え字付き配列)

配列は、書き換え自由な、いってみれば、本来の配列そのものです。自由に内容を書き換えられます。他の言語と概念は同じですが、「一次元」だけです。上記にあるように、実行中に自由にに書き換えられるし、演算対象として利用もできます。また、配列内のデータをソート(並び替え)する事もや、引数で、配列内を検索することも可能です。テーブルと同じことを、配列でもできますが、2この配列を使います。1個目の配列で見つけたら、その指標を取っておいて、2個目の配列の、その指標の内容を見るのです。プログラム実行中に可変なデータを扱い、しかもテーブルと同じようにするには、これしか方法がありません。

さあ、概念の話は、これくらいにしましょう。「配列の宣言」をE仕様書でします。(また、これを利用するのは、C仕様書(演算部)です。これは、後ほど)

E仕様書の定義の書式

テーブルの場合

     E                    TABHEX  6   6  1   TABDEC  2 0                       
** 
A10B11C12D13E14F15                                            

上記では、テーブルTABHEXとTABDECを、1レコードあたり、6個のデータを**以下に持ち、6個の要素を持つもので、TABHEXは1バイトの文字、TABDECは整数部分2小数点以下0桁(小数以下無し)として定義しています。ファイルから読み込んでいないので、このソースメンバーの最後に、** のあとに、セットされるデータを記述します。この部分は、HFELICOのOの次に記入される、仕様書とは関係のない部分です。このように、**の後に、データを書いておくと、コンパイル時にデータとしてプログラム内部に定義されます。

テーブル定義では、テーブル名は必ず、TABとなります。また、全体の名前の桁数は6桁までですので、TABxxxとなり、xxxの部分の名前を考えることになります。

**の次のところをよく見てください。A10B11C12D13E14F15となっていますね。これは、上のTABHEXが文字1バイト、TABDEC数字2桁と対応しているので、

A  10   B  11  C 12 D 13  E  14  F  15

というように2つのテーブルの値が交互にデータが並んでいることになります。このように定義します。これを「交互形式テーブル」といいます。

この定義により、記憶されるテーブルの内容。

TABHEX TABDEC
A 10
B 11
C 12
D 13
E 14
F 15

配列の場合

     E                    AP         10  3 0                    

上記の、APは、10個の配列要素をもち、その属性は、3桁の整数(小数点以下なし)です。この配列は、最初はすべて0です。中身は、プログラムの中で使われます。このような、配列を「実行時配列」と呼びます(マニュアルより)。配列の指標部分は、数字ですので、その指標部分を、演算で求めることも可能です。

上記APの内容です。

配列 AP
指標 1 000
指標 2 000
指標 3 000
指標 4 000
指標 5 000
指標 6 000
指標 7 000
指標 8 000
指標 9 000
指標 10 000

 

     E                    GDE     1   5 78                                  
**  +....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8   
F3=EXIT        F6=COLUMN HEADING  F7=TEXT      F8=FIELD  REC/ENT=NEXT RECORD
F9=TEXT+FIELD  F10=COLHDG+FIELD   F13=ONLY DATA          F24=MORE KEYS ...
F4=FIELDS LIST    F11=RECORD SELECTION              F24=MORE KEYS...
F14=MULTI/LINE<->SINGLE/LINE  F15=FIELD ATTRIBUTES  F16=ZERO SUPPRESS
F21=MEMBER INFORMATION  F22=PRINT RECORD  F23=DESELECT FIELDS   F24=MORE KEYS...     

配列、GDEは、最初からデータを持つものです。テーブルと違い、初期値が決まっているだけで、内容を書き換えることは可能です。でも、たいてい、書き換えずこのまま使います。

上記では、GDEを、1レコードあたり、1個のデータを**以下にもって、5個の要素を持つもので、78バイトの文字、として定義しています。ファイルから読み込んでいないので、このソースメンバーの最後に、** のあとに、セットされるデータを記述します。この部分は、HFELICOのOの次に記入される、仕様書とは関係のない部分です。このように、**の後に、データを書いておくと、コンパイル時にデータとしてプログラム内部に定義されます。これを、コンパイル時配列といいます。

配列 GDE
指標 1 F3=EXIT        F6=COLUMN HEADING  F7=TEXT      F8=FIELD  REC/ENT=NEXT RECORD
指標 2 F9=TEXT+FIELD  F10=COLHDG+FIELD   F13=ONLY DATA           F24=MORE KEYS...
指標 3 F4=FIELDS LIST    F11=RECORD SELECTION               F24=MORE KEYS...
指標 4 F14=MULTI/LINE<->SINGLE/LINE  F15=FIELD ATTRIBUTES   F16=ZERO SUPPRESS
指標 5 F21=MEMBER INFORMATION  F22=PRINT RECORD  F23=DESELECT FIELDS   F24=MORE KEYS...

じつは、テーブルの代わりに、「交互形式配列」というものがあるのですが、結局、設定データを、A10B11の様に、2種類の配列の中に交互にセットしたい場合に使う程度で、あまり、私は使ってません。

また、配列をソートする場合は、E仕様書の45桁めにA(昇順Ascending)D(降順Descending)が重要です。もしなにも指定しない場合は、昇順です。つまり、降順にしたい場合は、必ず、Dを必要とします。また、検索命令で、イコール以外は、この昇順・降順は必須です。たしか、コンパイルエラーの対象ですので、すぐに気づきます。この辺の詳細は、C仕様書で説明します。

それでは、今日はこの辺で、

起立、礼、着席


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

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

 

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