第6章  E仕様書−配列
RPGプログラマーの為のC言語講座

配列についてRPGとC言語の違いについてみていきましょう。

配列とは、同じ長さ,属性,の変数をいくつか並べて扱える変数のまとまりです。
配列は、RPGでは、E仕様書で定義します。

RPGの配列の各要素のデータの設定は、コンパイル時,プログラム内部でまたはファイルから行うことができます。

まず、定義方法についてをRPGとC言語で比較しましょう。

[RPG]
  *...1....+....2....+....3....+....4....+....5....+....6
  E....FromfileTofile++Name++N/rN/tbLenPDSArrnamLenPDSCom
  E                    A           8  1

[C言語]
      char A[8];
RPGの場合、桁数がわかりにくいと思いますが、 27 〜 32 桁目が配列名(A)、36 〜 39 桁目が配列中の項目の数(8)40 〜 42 桁目が、項目の長さ(1)です。

C言語の場合、”型名 配名[配列の要素の数];”です。

この定義は、いずれも、1バイトの文字を8個並べた配列Aを定義しています。下図を参照してください。

配列A
...
...
...
...
...
...
...
...


RPG
C言語
A,1
A,2
A,3
A,4
A,5
A,6
A,7
A,8
A[0]
A[1]
A[2]
A[3]
A[4]
A[5]
A[6]
A[7]

配列の各要素を表すには、RPGの場合は、配列名,添字、Cの場合は、配列名[添字]となります。
RPGは、配列の要素を1から数えますので、1番目の要素は、A,1となり、A,0はエラーになります。 これに対し、C言語は、通常配列の要素をゼロから数えますので、char A[8]とした場合は、1番目の要素はA[0]となり、A[8]は存在しません。

次に、実際に配列の各要素にデータをセットする方法についてみていきましょう。

1.コンパイル時に配列の各要素にデータを設定する方法

[RPG]
  *...1....+....2....+....3....+....4....+....5....+....6
  E....FromfileTofile++Name++N/rN/tbLenPDSArrnamLenPDSCom
  E                    A       8   8  1
...
**
ABCDEFGH

[C言語]
      char A[8] = {'A','B','C','D','E','F','G','H'};
RPGの場合、ソースコードの一番最後に、配列定義した順番に、配列のデータ項目を記入します。そして、この配列入力レコード中の配列項目数を、ファイル仕様書(補足 E )の33 〜 35 桁目に記入します。上記の例では、一行に8個のデータ項目を記入しているので、35 桁目に8と記入しています。もしここに4と設定した場合は、以下のようになります
  *...1....+....2....+....3....+....4....+....5....+....6
  E....FromfileTofile++Name++N/rN/tbLenPDSArrnamLenPDSCom
  E                    A       4   8  1
...
**
ABCD
EFGH
C言語の場合は、配列もほかの変数と同じく、定義するときに初期化できます。初期化するデータは中カッコ{}で囲み、カンマで区切って表します。初期化するデータは配列の第1要素から順番に指定していきます。配列の要素数よりもデータ項目の方が少ない場合には、残りの要素には0が設定てれます。また、初期化するデータ項目が、要素数と等しい場合は、配列の要素数の指定を省略することが可能です。
    char A[8] = {'A','B','C','D','E','F','G','H'};
は、
    char A[] = {'A','B','C','D','E','F','G','H'};
と書くこともできます。

省略することのメリットとしては、あとでデータ項目を追加する場合に、要素の数を書き換えなくてもコンパイルが可能になります。もし、下記のように、要素数がデータ項目より少ないと、コンパイル時にエラーとなります。

    char A[8] = {'A','B','C','D','E','F','G','H','I','J'};
これは、コンパイル・エラーとなります。

RPGの配列に指定できる型(データ・タイプ)は、文字フィールド(文字列)、ゾーン十進数,パック十進数です。
一方、C言語では、これらの型はありません。文字列は、文字型(char)の配列として、処理する必要があります。
RPGでの文字列の配列は、C言語では、2次元配列として定義します。

文字列の配列定義

[RPG]
  *...1....+....2....+....3....+....4....+....5....+....6
  E....FromfileTofile++Name++N/rN/tbLenPDSArrnamLenPDSCom
  E                    STR         3  4

[C言語]
      char STR[3][4];

この定義は、いずれも、4バイトの文字列(1バイト文字を4個並べた配列)を3個並べた配列STRを定義しています。下図を参照してください。

RPG

配列STR
...
...
...

STR,1 STR,2 STR,3
STR[0][0] STR[1][0] STR[2][0]
C言語
....
....
....
STR[0][0]STR[0][1]STR[0][2]STR[0][3]
2次元配列 STR[3][4]

配列の各要素を表すには、RPGの場合は、配列名,添字、Cの場合は、配列名[添字][添字]となります。 RPGは、4バイトの文字列を配列の要素としてとるので、1番目の要素は、STR,1となります。これに対し、 C言語は、文字の配列の配列(2次元配列)として定義してあるので、最初の添え字が要素、2番目の添え字が長さに相当します、よって、

    STR[0][0], STR[1][0], STR[2][0], STR[3][0]
とカウントアップすれば、4バイト毎に指定でき、
    STR[0][0], STR[0][1], STR[0][2], STR[0][3]
とすると、1バイト毎に指定が可能です。

RPGは残念ながら多次元の配列をサポートしていませんが、C言語では、このように配列の配列と言うかたちで多次元の配列を扱うことが可能です。

    例)ary[5][3][4] 上記の配列をさらに5個持てる配列

このように書くとC言語の配列は、扱いが非常にめんどうなものだと思われてしまうかもしれませんが、
実際めんどうです。
ここでの解説は、配列に絞っているため、ポインターを使用していません。
実際のプログラミングの際には、ポインターと配列を併用するのが普通です。
配列の次の章では、ポインターと配列を使用したプログラミングをサンプル・コーディングを交えて解説したいと思います。
もう少しすっきりとしたコーディングになるはずです