MF 

パラメーター化セクション

COBOL には、CALL 文、オブジェクト指向メソッドの呼び出し、組み込み関数など、サブルーチンにパラメーターを渡すためのメカニズムが複数ある。

ただし、ほとんどの COBOL プログラムでは、サブルーチンを呼び出す主な手段として PERFORM 文が使用されており、現在までのところパラメーターを渡す方法は提供されていない。代わりに、多くの場合、PERFORM の前に作業場所節項目の値を設定し、実行される手続き内でその作業場所節項目から値を取得することによって情報がサブルーチンに渡される。この例を次に示す。

01 temp-num binary-long. ... move 3 to temp-num. perform display-it. ... display-it section. display temp-num. ...

この方法には、参照の局所性がないという欠点がある。最初のセクションの実行時点で temp-num の値が変わることを想定していない可能性があり、結果として予期しない動作が発生する。また、実行される手続きで想定される内容が呼び出し前に明示されることはないため、何らかの必要な入力がまだ設定されていない場合に予期しない動作が発生することがある。

パラメーター化セクションでは、プログラムのセクション内でデータの局所性を提供することでこのような問題が克服される。前の例は次のようにコード化でき、作業場所節項目を変更する必要はない。

perform display-it(3). ... display-it section (num-param as binary-long). display num-param.

この構文を使用する場合は、display-it section にパラメーターを渡して実行する必要がある (パラメーターを省略すると翻訳エラーが発生する)。

セクションの見出し内でデフォルト値を指定するとパラメーターを省略できる。次の例では、他の値が渡されない場合、section パラメーターのデフォルト値である 99 が表示される。

perform display-it(). ... display-it section (num-param as binary-long = 99). display num-param.

パラメーター化セクションで値を返すこともできる。この例を次に示す。

01 i1 binary-long value 3. 01 i2 binary-long value 4. 01 i3 as binary-long. ... perform addvars (i1, i2) returning i3. display i3. goback. addvars section(p1, p2) returning res as binary-long. add p1 p2 giving res.

このようなセクション (つまり、returning 指定があるセクション) を関数構文を使用して参照することも可能である。display 文の例を次に示す。

01 i1 binary-long value 3.01 i2 binary-long value 4. ... display addvars(i1, i2). goback. addvars section (p1 as binary-long, p2 as binary-long) returning res as binary-long. add p1 p2 giving res.

パラメーター化セクションのスタック ローカル変数

DECLARE 文は、もともとは JVM COBOL のコンテキストで導入されたものである。最近では、この文でネイティブ COBOL コードもサポートされている。ただし、以前のネイティブ COBOL コードでは、このような変数は実質的に局所記憶節に追加されるため、再帰的なコンテキストにおいては想定どおりに動作しない。この古い動作は、コンパイラの DECLARE"1" 指令を使用して引き続き利用できる。ただし、新しいデフォルトの動作を使用すると、セクションに入るたびにローカル宣言変数が新たに割り当てられる。

n 番目のフィボナッチ数を計算する簡単なルーチンを使用した例を次に示す。

s1 section(n1 as binary-long) returning ret as binary-long. if n1 <= 1 set ret to n1 exit section end-if declare left-side as binary-long = s1(n1 - 1) declare right-side as binary-long = s1(n1 - 2) compute ret = left-side + right-side *> another alternative to the above three lines could be: *> compute ret = s1(n1 - 1) + s1(n1 - 2)

パラメーター化セクションの他の使用例については、「パラメーター化セクション (例)」トピックを参照。