Google
オフコン練習帳内を検索
インターネット全体を検索

NECオフコン関連
オフコン一般
情報

トップ  >  データ項目の初期値

データ項目の初期値

データ項目に何も値を入れていないときの値は?

JavaとかC言語で、ローカル変数を宣言して値を入れずに参照した場合、どうなるでしょうか?いきなりCOBOLではない話ですみません。
例えば、次のようなプログラムを書いても問題ないでしょうか。

C言語のプログラム例
void main() {
   int i;
   i = i + 1;
    :

C言語やJavaではローカル変数を宣言しただけでは、その値は不定です。上のプログラムは変数iの値が不定なのでコンパイルすると警告がでると思います。何らかの方法で初期値を入れてから変数を使用します。
COBOLも同じで、データ項目を定義しただけでは、その値は不定です。

  01  I    PIC 9(06) VALUE 0.

◆ 01  I    PIC 9(06).
      :
       INITIALIZE   I.

  01  I    PIC 9(06).
       MOVE 0 TO I.

COBOLでは、,里茲ΔVALUE句で初期値を入れたり、△筬のように命令部で初期値を入れたりといったことを行います。

とここまでは、正式なCOBOLの言語仕様の話です。
NECオフコンのCOBOLは違うのです。NECオフコン用のCOBOL言語仕様書には次のような記載があります。

A−VX拡張機能(初期値)
 本コンパイラでは、VALUE句のないデータ項目の初期値は、次のようになる。
〆邏半貊蠕
  作業場所節内のVALUE句を定義したデータ項目の領域以外はすべて”40”(16)となり、
  空バイトも全て”40”(16)となる。
▲侫.ぅ訐
  ファイル節内の01レコード領域の初期値は、そのファイルの参照モードによって異なる。
  参照モードの場合は、作業場所節内の領域と同様にすべて”40”(16)となり、ロケートモード
  の場合は不定であり、通常はすべて”00”となる。なお、整列用ファイルおよびSELECT句
  EXTERNALの指定されたファイルの01レコード領域はすべて”40”(16)となる。
D命節
  通信領域の初期値は、個々のデータ項目のデータ表現形式に従って空白(”40”(16)か
  ゼロ(”F0”(16))である。
   :
ナ鷙霆饑
  印刷行の中の印刷項目でない部分はすべて空白(”40”(16))となる。

(必要に応じて一部省略)

NECオフコンのCOBOLでは、VALUE句で初期値を指定していないデータ項目は、16進数の40、つまり1バイトの空白文字になります。符号なしの外部10進数の場合は、実質ゼロ(0)で初期化されていることになります。(内部10進数の場合は演算で使用した時点で不正十進数エラーとなる。単精度2進は16進数で4040つまり+16448、倍精度2進は16進数で40404040つまり+1077952576)

NECのオフコンの場合、このように初期値を設定しない場合は空白または(符号なし外部10進数の場合は)ゼロになるので、初期値を設定しないままデータ項目を使用しているプログラムがたくさんあります。NECオフコンのCOBOLならこれはバグでも何でもなく、正しい書き方です。

NECオフコンのCOBOLで書かれたプログラムを他のCOBOL、例えばマイクロフォーカスのCOBOLに移行しようとするとこれが問題になります。最初に書いたように、COBOLの標準仕様では、初期値を入れていないデータ項目は不定値です。当然うまく動きません。

ちなみに「A−VX拡張機能」と書かれているように、NEC内のCOBOLとしても独自になります。(NECのどのCOBOLでも共通の独自機能なら「NEC拡張機能」と書かれる。)NECの他のCOBOL、例えばNECが販売しているWindows用のCOBOLは、COBOLの標準仕様に従っていて、初期値を入れていないものは不定値になります。(ただし、NECの場合はオフコン互換機能があって、コンパイルオプションで初期値を設定するように変更できるようです。)