第7章  I仕様書−データタイプの違い
RPGプログラマーの為のC言語講座

RPG言語とC言語で扱えるデータタイプ違いについてみていきましょう。

RPGプログラムのフィールドは、
  • 文字列
  • ゾーン 10 進数
  • パック 10 進数
  • 2進数形式
とすることができます。

外部記述を使用する場合は、さらにデータタイプが増えますが、各データタイプとCのデータ型との 対応については、内部/外部記述の章を見て下さい。

RPGプログラムの内部では、内部数値はパック 10 進数で扱われます。
(例外は、データストラクチャーのサブフィールドなどで定義されいている場合です。)

そのため、何の指定もせずにRPGプログラム内で数値定義を行うと、そのフィールドは パック 10 進数となります。

RPGプログラムでその他の数値、ゾーン 10 進数、2進数形式を定義する場合は、I仕様書を利用します。

     IDATAS1      DS
     I                                    B   1   20BIN2
     IDATAS2      DS
     I                                    B   1   40BIN4
     IDATAS3      DS
     I                                       1  100ZONE

BIN2 は2バイトの2進数形式 (short int に相当)
BIN4 は4バイトの2進数形式 ( int に相当)
ZONE は10バイトのゾーン 10 進数 (一般のCでは持っていないデータ型となります。)

[Cプログラムで利用する場合は?]

AS/400では、ヘッダーファイル decimal.h にパック10進数のデータ型が定義されています。 このヘッダーファイルをインクルードすると、パック10進数の型は decimal(n,p) がり利用出来ます。 ここでn は、パック 10 進定数の桁を表し、p は、少数部の桁数です。

deciaml(9.2) aaa;

の様に定義します。 文字定数で記述する場合は、

12345.99D または 12345.99d

の様に定義します。

ゾーン 10 進数 は文字型の配列 char[n]で対応します。符号の処理のみ必要ですが、文字としては 同じ値となります。

ゾーンを他のデータ型に変換する為の関数もAS/400では、用意されているので利用可能です。

QXXDTOP浮動小数点をパック10進数に変換する
QXXITOP整数をパック10進数に変換する
QXXPTODパック10進数をdoubleに変換する
QXXPTOIパック10進数を整数に変換する
QXXITOZ整数をゾーン10進数に変換する
QXXDTOZdoubleをゾーン10進数に変換する
QXXZTODゾーン10進数をdoubleに変換する
QXXZTOIゾーン10進数を整数に変換する