17.8.RPGの基本(E;配列について) |
今日の講義は、「配列」です。仕様書はE仕様書と主に、C仕様書が関係します。(i仕様書を使うこともあります。)E仕様書は、HFELICOのEですね。Extension Specificationsのことです。 E仕様書では、他の言語でいうところの、いわゆる、「配列の宣言」をします。(よく見ると、すごい言葉ですよね。でもそーゆーのです。「宣言」は Declarationのことです。)プログラムを作る人には。さけて通れない、というより、知らなければ、損をするテクニックです。 さて、最初に、配列そのものの概念を説明します。 配列の概念BASICにも、コボルにも、どんな言語にも、「配列」はあります。プログラム固有の概念でしょう。「配列」とは、一般的には、もの並び方を指す言葉ですが、プログラムでは、 データを、番号のついた引き出しに一時保管できるプログラム内部の「変数」です。 ※ 「変数」とは、プログラム内部で一時的に、数字や文字のデータを入れておく場所です。これがないと、プログラムは作れません。 この「番号」を、「指標」とか「添え字」とか呼びます。RPGでは、「指標」というのが一般です。(マニュアルで使われています)。指標は演算可能な数字です。(ここがポイント) この配列はプログラムを実行するときに、メモリの一部を利用して、実行時に動的に参照されます。ですから、無駄に大きな配列はタブーです。繰り返しますが、配列そのものや、配列の操作は、オンメモリ(メモリ内)で行われます。プログラム外部のディスク上のオブジェクトを参照はしません。あくまでプログラム内部の「番号付き引き出し保管場所」です。 配列のイメージ 上の、配列のイメージ図では、 配列要素の数は6つ。この配列は必ず名前が必要です。たとえば、上図の配列名を「NUM」ということにすると、
となります。 さらに、この配列は、「一次元配列」といいます。なにか1つのことが決まると、それに伴い1つの内容が決定されるのです。たとえば、指標=1と決まれば、内容=1234と決まります。これに対して、「二次元配列」は、なにか2つのことが決まると、それに伴い1つの内容が決定されるものです。たとえば、指標=(1、2)と決まったら、内容=Wと決まるような場合です。 一次元配列の例。「国語のテスト」を引数として検索すると、70と決まる。
プログラムの配列では、上記の例の、数学のテストの点などを「指標」と考えれば、いいですね。たとえば、「数学のテストの点」を1、「国語のテストの点」を2、「社会のテストの点」を3、として、配列名を、PNTとすると、
となります。 二次元配列の例。教養として...「社会のテスト」だけでは、75,70,88と複数となり、一つになりませんね。「社会のテスト」かつ「山田君」と2つ決まって、75と決まります。
RPGでは、E仕様書で、直接指定できるのは、「一次元配列」のみです。「二次元」以降は使えません。 ※ ただし、ある方法で、一次元を複数組みあわせて、「擬似的な」二次元配列を実現することは可能です。オカレンスを利用するのですが、中級のテクニックなので、今は、一次元の配列の習得を優先してください。 指標指標は、1以上で配列の要素数以下までの数字が使えます。BASICは、指標0が使え、この指標0で特別な使い方をしたものですが、指標に0が使えるのはかなり特殊です。 RPG指標 0 は、では使えません。指標に0を指定するとRPGではエラーになります。 また、指標は数字の変数として、定義したり、これを演算した結果として、配列の内容を取り出すことも可能です(というより、この方が実践では多いです。) なぜ配列を使うのか(メリットは何か)自分の経験から言うと、次のようになります。
例)
テーブル(表)とアレイ(配列)RPGでは、E仕様書で定義できるものが2つあります。テーブルと配列です。 テーブルテーブルは、2つの要素からなる、固定情報(よく、「レテラル」といいます)の参照用です。実行中に内容を書き換えることはできません。さらに、指標はありません。あくまで、「表」です。たとえば、テーブルの内容をあらかじめプログラム内部で定義しておいて、C仕様書などで、引数(ひきすう、と読みます。)を与えて、テーブル要素を取り出します。指標の代わりに、探索したい値が入っているようなものです。また、テーブルの内容は、ファイルから取り出してセットすることも可能です。F仕様書の「ファイルの指定」にTをセットして、E仕様書にそのファイル名を「取り出しファイル名」にセットすれば、初期ルーチンでファイルを勝手に読み込んで、テーブルにセットしてくれます。 ひとつ、ルールがあり、テーブルの場合は、名前をTABで始めなければなりません。また、遅くとも、プログラム実行までには、内容が確定してなければならないことはおわかりですよね。 例)
ここで、C仕様書で、TABAMTに11,000を引数として、TABAMTで検索をすると、TABRATには0.05が取り出されます。つまり、10,000から29,999は0.05が返されるのです。これで、指標が出てこないわけわかるでしょう?このテーブル、RPG独特のものです。 配列(添え字付き配列)配列は、書き換え自由な、いってみれば、本来の配列そのものです。自由に内容を書き換えられます。他の言語と概念は同じですが、「一次元」だけです。上記にあるように、実行中に自由にに書き換えられるし、演算対象として利用もできます。また、配列内のデータをソート(並び替え)する事もや、引数で、配列内を検索することも可能です。テーブルと同じことを、配列でもできますが、2この配列を使います。1個目の配列で見つけたら、その指標を取っておいて、2個目の配列の、その指標の内容を見るのです。プログラム実行中に可変なデータを扱い、しかもテーブルと同じようにするには、これしか方法がありません。 さあ、概念の話は、これくらいにしましょう。「配列の宣言」をE仕様書でします。(また、これを利用するのは、C仕様書(演算部)です。これは、後ほど) E仕様書の定義の書式テーブルの場合
上記では、テーブル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つのテーブルの値が交互にデータが並んでいることになります。このように定義します。これを「交互形式テーブル」といいます。 この定義により、記憶されるテーブルの内容。
配列の場合
上記の、APは、10個の配列要素をもち、その属性は、3桁の整数(小数点以下なし)です。この配列は、最初はすべて0です。中身は、プログラムの中で使われます。このような、配列を「実行時配列」と呼びます(マニュアルより)。配列の指標部分は、数字ですので、その指標部分を、演算で求めることも可能です。 上記APの内容です。
配列、GDEは、最初からデータを持つものです。テーブルと違い、初期値が決まっているだけで、内容を書き換えることは可能です。でも、たいてい、書き換えずこのまま使います。 上記では、GDEを、1レコードあたり、1個のデータを**以下にもって、5個の要素を持つもので、78バイトの文字、として定義しています。ファイルから読み込んでいないので、このソースメンバーの最後に、** のあとに、セットされるデータを記述します。この部分は、HFELICOのOの次に記入される、仕様書とは関係のない部分です。このように、**の後に、データを書いておくと、コンパイル時にデータとしてプログラム内部に定義されます。これを、コンパイル時配列といいます。
じつは、テーブルの代わりに、「交互形式配列」というものがあるのですが、結局、設定データを、A10B11の様に、2種類の配列の中に交互にセットしたい場合に使う程度で、あまり、私は使ってません。 また、配列をソートする場合は、E仕様書の45桁めにA(昇順Ascending)D(降順Descending)が重要です。もしなにも指定しない場合は、昇順です。つまり、降順にしたい場合は、必ず、Dを必要とします。また、検索命令で、イコール以外は、この昇順・降順は必須です。たしか、コンパイルエラーの対象ですので、すぐに気づきます。この辺の詳細は、C仕様書で説明します。 それでは、今日はこの辺で、 起立、礼、着席 |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||