Previous データ部 - 画面節 手続き部 - 組み込み関数 Next

第 10 章 : 手続き部

10.1 一般説明

手続き部(procedure division)は、宣言しても、宣言しなくてもよい。

プログラム定義、

関数定義、

またはメソッド定義の中の手続き部は、実行されるべき手続きを含む。これらの手続きは、宣言文または非宣言文のいずれか、または両方である。

オブジェクト定義およびファクトリ定義の中の手続き部は、オブジェクトまたはファクトリオブジェクトにより起動されるメソッドを含む。

呼出しプロトタイプの中の手続き部は、手続きをまったく含まない。ただし、ENTRY文を含む場合はある。

関数プロトタイプ、メソッドプロトタイプ、またはプログラムプロトタイプの中の手続き部では、パラメータまたは戻り項目(もし、あれば)を指定する。

一般形式

形式 1 (節を含む)

形式 2 (節を含まない)

形式 3 (インターフェイスオブジェクトまたはファクトリ)

用語、「手続き部の見出し」については、次の手続き部の見出し節で説明する。

形式 1 および 2 は、プログラム定義中、

プログラムプロトタイプ定義、関数定義、関数プロトタイプ定義、

メソッド定義、または

呼出しプロトタイプ

でのみ使用できる。

形式 3は、ファクトリ定義またはインターフェイス定義、

またはオブジェクト定義

でのみ使用できる。

上記の宣言完結文(declarative-sentence)は、USE文である。(本書の手続き部 - SEARCH - XML PARSEの章のUSE(使用)文節、および言語リファレンス - 追加トピックの中のデバッグモジュールの章のUSE FOR DEBUGGING文節および報告書作成の章のUSE BEFORE REPORTING文節を参照)USE文は、該当する節をいつ実行するかを指定する。

手続きは、手続き部内の段落または段落集団、あるいは節または節集団から成る。手続き名は、それが使用される原始要素中の段落または節を示す語である。手続き名は段落名(修飾される場合もある)または節名から成る。

ある段落がある節内にある場合、すべての段落がその中になくてはならない。

この規則は強制しない。

段落は、段落名の後に続けて終止符(.)と空白を書き、後ろに完結文をいくつか書いたものである。段落の終了は、次の段落名または節名の直前、あるいは、手続き部の終わり、宣言部分のEND DECLARATIVESのところまでとなる。

節は、節見出しと、その後に続くいくつかの段落から成る。節の終了は、次の節名、あるいは手続き部の終わり、宣言部分のEND DECLARATIVESのところまでとなる。

しかし、宣言中の節は宣言完結文を必要としない。これはPERFORM文によって開始できる。(PERFORM文の詳細については、手続き部 - PERFORM - ROLLBACKの章のPERFORM(実行)文節を参照。)

完結文(sentence)は、上記で説明した名前付きの段落内に明示的には含まれない。名前のない暗黙的な段落内に含まれているとみなされる。段落は、節内に明示的には含まれない。名前のない暗黙的な節内に含まれているとみなされる。

プログラムの定義、

またはメソッドの定義

では、実行は、手続き部の宣言部分ではない最初の文から始まる。以降、文は記述されている順序に実行される。ただし、他の順序が示されている場合は例外である。

呼出しプロトタイプでは、手続き部は実行されない。

オブジェクトの定義では、宣言部分が、親であるメソッド定義のすべてで指定されている場合と同様に動作する。

ファクトリの定義では、宣言部分が、親であるメソッド定義のすべてで指定されている場合と同様に動作する。

ここでは、算術式と条件式、共通指定と入出力指定、組み込み関数、COBOL動詞について説明する。

手続き部の見出しは、手続き部の形式 2 では書いても書かなくてもよい。ただしこれは、、これより前に部が記述されていない場合、および手続き部がCOBOLの文で始まる場合(節見出し、段落見出し、宣言節ではなく)にだけ、任意となる。

10.2 手続き部の見出し

手続き部の冒頭には、下記の見出しを付けなければならない。

一般形式

形式 1

形式 2

指令

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

    • DEFAULTCALLS - 手続き部の見出しに明示的に指定されていない場合に、省略時の呼出し方式を設定する。

    • STICKY-LINKAGE - 同じプログラム内で複数の呼出しを異なる入口点から行う間に、連絡節内のデータ項目の番地参照性を維持するか否かを制御する。

構文規則

すべての形式
  1. 呼び名は、目的プログラムが他のプログラムにより起動され、そのプログラムがCOBOLシステムの省略時設定として使用される以外の呼出し規則を使用している場合にだけ必要である。一般に、省略時設定のCOBOL呼出し規則は、実行時環境のCOBOL以外の言語の環境によって使用されるものと一致する。

    呼び名は、特殊名段落で定義しなければならない。この方法、および実行時環境でサポートされる呼出し規則とのインターフェイスをCOBOLシステムで記述する方法の詳細については、環境部の章の特殊名段落節を参照。

  2. CHAININGおよびUSINGは同等である。

  3. データ名-1 またはデータ名-2 をUSAGE OBJECT REFERENCE で指定した場合、ACTIVE-CLASS指定は使用できない。

  4. データ名-3 は、 連絡節でレベル 01またはレベル 77記述項として指定しなければならない。データ名-3 のデータ記述項は、REDEFINES句を含めてはならない。連絡節中の別の場所にあるデータ項目では、REDEFINES句でデータ名-3を指定してもよい。

  5. データ名-3は、データ名-1と データ名-2のいずれとも同じであってはならない。

形式 1
  1. データ名-1は、呼ばれるプログラムのリンク節、

    ファイル節、または作業領域節

    で、レベル01またはレベル77項目として定義されなければならない。特定のユーザ定義の語は、データ名-1として 2回以上現れてはならない。

    2回以上現れてもよい。

    データ名-1の記述項目は、REDEFINES句を含んではならない。

    REDEFINES句を含んでもよい。

    しかし、データ名-1はリンク節のどこにおいても REDEFINES句の対象にできる。

  2. データ名-2は、呼ばれるプログラムのリンク節、

    ファイル節、または作業領域節

    で、レベル01またはレベル77項目として定義されなければならない。データ名-2 は、字類が数字、オブジェクト、またはポインタのデータ項目として定義しなければならない。

    データ名-2の字類はどれでもかまわない。ただし、その長さは8バイト以下でなければならない。

  3. RETURNING指定は、関数定義および関数プロトタイプ定義の中で指定しなければならない。

  4. RETURNING指定は、メソッド定義、プログラム定義、およびプログラムプロトタイプの中で指定しなければならない。

形式 2
  1. 形式 2 は、PROGRAM-ID段落に記述されたEXTERNAL句のあるプログラムでだけ使用することができる。これは、呼出しプロトタイプである。

  2. データ名-1とデータ名-2は、リンク節の01レベルレコードとして定義しなければならない。

  3. 型定義名-1、型定義名-2、型定義名-3は、同じ原始ファイルにTYPEDEF句でプログラマ定義の使用としてあらかじめ定義しなければならない。

一般規則

すべての形式
  1. 手続き部見出しのUSING句では、5つまでのデータ名が許される。

    USING句では、62までのデータ名が許される。

  2. BY REFERENCE句およびBY VALUE句は、他のBY REFERENCE句またはBY VALUE句があるまで、それに続くパラメータを移行する。はじめのパラメータに先行してBY REFERENCE句またはBY VALUE句が記述されていないと、BY REFERENCE句が想定される。

形式 1
  1. 呼び名は、このプログラムがそれをプログラム名あるいは入口名で起動した呼ぶプログラムにより適用されたとみなされる呼出し規則を確認する。実際に使用された呼出し規則が呼び名によって示されたものと異なる場合、COBOLシステムが動作しなくなる場合がある。

  2. データ名-1がレベル01またはレベル77項目としてファイル節あるいは作業領域節に定義されている場合、目的プログラムは、データ項目がデータ名-1と同じデータ宣言でリンク節に定義されたかのように動作し、呼ばれるプログラムの最初の文の実行に先立って、このデータ項目の内容がデータ名-1に移動されたかのように動作する。最初のプログラムでは、これらの値はプログラムの作業領域のデータの初期化によって上書きされる。このため、呼ばれるプログラムには使用できない。

  3. 呼ぶプログラムがCOBOLの場合、以下の規則を適用する。呼ぶプログラムがCOBOLでない場合、BY REFERENCEまたはBY VALUE句を使用する必要がある時の詳細は、COBOLシステムのマニュアルを参照。

  4. USING指定は、引数の渡し先であるプログラム、

    関数、

    またはメソッドが使用する仮パラメータの名前を識別する。渡された引数は、原始要素が起動する際に、以下のいずれかにより識別される。

    • CALL文のUSING指定
    • 関数一意名中の引数
    • INVOKE文のUSING指定
    • メソッドの行内呼出しで指定された引数
    • 暗黙的SETプロパティメソッドの起動に関するオブジェクトプロトタイプの規則で定義された引数

    2つの名前リストの間の対応は、位置を元にして決められる。

  5. 内容により引数が渡された場合は、起動するランタイム要素により、実行の開始処理中に連絡節中のレコードが割り当てられた場合と同様に動作する。また、このレコードが、起動するランタイム要素の中の引数と同じ記憶域を占めていない場合と同様に動作する。

    起動する側のランタイム要素のリポジトリ段落に、起動される側のランタイム要素のプログラム指定子が含まれておらず、CALL文に対するNESTED指定がない場合は、この割り当てられたレコードは、引数と同じ長さとする。ここで、引数が変数反復データ項目として記述されていれば、最大長が使用される。引数は、変換されることなく、この割り当てられたレコードに転記される。このレコードはその後、起動される側のランタイム要素によって、引数として、また、参照により引き渡されるものとして扱われる。

    起動される側のランタイム要素が、

    • 起動する側のランタイム要素のリポジトリ段落に、そのプログラム指定子が含まれているプログラム、
    • NESTED指定を含むCALL文で呼び出されたプログラム、
    • メソッド、または
    • 関数

    のいずれかである場合、この割り当てられたレコードは、以下のいずれかとなる。

    • 仮パラメータがANY LENGTH句で記述されている場合は、引数と同じ項類、用途、および長さのデータ項目
    • 仮パラメータが変数反復データ項目として記述されている場合は、仮パラメータと同じ記述およびバイト数(最大長が使用される)のデータ項目

    以下のいずれかで、引数が送出し側作用対象として、また、割り当てられたレコードが受取り側作用対象として使用される。

    • 仮パラメータが数字項目の場合、ROUNDED指定を伴わないCOMPUTE文
    • 仮パラメータの字類が指標、オブジェクト、またはポインタの場合、SET文
    • MOVE文

    割り当てられたレコードは、その後、引数として、また、参照により引き渡されるものとして扱われる。

  6. 引数が参照により引き渡される場合は、起動される側のランタイム要素は、仮パラメータが引数と同じ記憶域を占める場合と同様に動作する。

  7. 引数が値により引き渡される場合は、起動される側のランタイム要素は、連絡節中のレコードが、起動する側のランタイム要素の起動の開始処理中に割り当てられる場合と同様に動作する。また、また、このレコードが、起動するランタイム要素の中の引数と同じ記憶域を占めていない場合と同様に動作する。この割り当てられたレコードの英数字文字位置の長さは、引数とまったく同じとする。この引数は、変換されることなく、この割り当てられたレコードに転記される。このレコードはその後、起動される側のランタイム要素によって、引数として、また、参照により引き渡されるものとして扱われる。

  8. 呼ばれるプログラム中ではいつでも、データ名-1、

    データ名-2、およびデータ名-3

    への参照は、呼ばれるプログラムのリンク節で与えられた項目の記述に従って決定される。この記述が呼ぶプログラムの相応するデータ項目よりも多くの文字位置を定義している場合、予期せぬ結果となる。この規則の適用に失敗したり、特定のランタイム環境用のシステム領域で許される最大サイズを超えると、システムはたいへんな損害を被ることになる。

  9. プログラムが呼ばれ、USING句のBY REFERENCE作用対象が呼ぶプログラムのパラメータに相応する時、関連する接続が確立され、呼ぶプログラムに制御が戻るまで保たれる。プログラムが間にキャンセルせずに二度呼ばれ、同じBY REFERENCE作用対象が呼ぶプログラム中のパラメータと一致しない場合、この作用対象をSTICKY-LINKAGEコンパイラ指令を指定せずに参照してはならない。

  10. OPTIONAL指定がデータ名-1について使用されている場合は、対応する引数としてOMITTED指定を使用できる。そうでない場合は、 OMITTED指定を対応する引数として使用してはならない。

形式 2
  1. 呼出しプロトタイプ(PROGRAM-ID段落中のEXTERNAL句付きのプログラム)が 書き方 2 PROCEDURE DIVISION見出しを持ち、同じ原始ファイル中の他のプログラムがこの呼出しプロトタイプのプログラム名を参照するCALL文を持っている場合、以下の規則が提供される。

    1. 呼出し規則がCALL文中に記述されている場合、これはプロトタイプに(明示的あるいは暗黙的に)記述されたものと一致しなければならない。CALL文に呼出し規則が記述されていない場合、プロトタイプに(明示的あるいは暗黙的に)記述された呼出し規則が使用される。

    2. CALL文に記述されたパラメータの数は、プロトタイプに記述されたパラメータの数と同じでなければならない(REPEATED句により許されたものを除く)。

    3. CALL文に記述された各パラメータには、以下の規則が適用される。

      1. BY REFERENCE句またはBY CONTENT句がパラメータと関連している場合、プロトタイプ中の相応するパラメータは、BY REFERENCEで指定されなければならない。

      2. BY VALUE句がパラメータと関連している場合、プロトタイプ中の相応するパラメータは、BY VALUEで指定されなければならない。

      3. CALL 文中のパラメータがBY REFERENCE句、BY CONTENT句、BY VALUE句を持たない場合、プロトタイプに(明示的あるいは暗黙的に)記述された句が使用される。

      4. この規則は、相応する呼出しプロトタイプが見つからない時に適用される規則を置換える。つまり、呼出しプロトタイプが使用されない時、はじめのBY句までのすべてのパラメータは、BY REFERENCEが指定され、BY句の後のすべてのパラメータ(これ自身は明示的なBY句を持たない)が最後の一つを使用するかのように扱われる。しかし、相応する呼出しプロトタイプが見つかる時は、BY句用の定義が優先する。

      5. プロトタイプ中のパラメータの字類が数字、あるいはポインタか索引データ名の場合、CALL文中のパラメータは同じデータ定義を持たなければならない。

      6. プロトタイプ中のパラメータの字類が英数字である場合、CALL文中のパラメータも英数値クラスもので、プロトタイプ中のパラメータと少なくとも同じ長さでなければならない。

      7. ANYがプロトタイプに記述されている場合、CALL文中のパラメータはどの字類でもよい。

    4. CALL文が GIVING句またはRETURNING句を含んでいる場合、プロトタイプも句を含んでいなければならない(逆も同様)。CALLに記述されたデータ項目のデータ定義は、プロトタイプに記述されたデータ項目のものと同じでなければならない。

    5. プロトタイプ中のDELIMITED BY SIZE句は、英数字パラメータ用にだけ使用される。この場合、CALL文中の対応するパラメータは暗黙に割当てられたデータ領域に移動され、バイナリ0 (x"00") 文字がこのデータのコピーの直後に置かれる。BY SIZE句が省略されると、CALL 文中の対応するパラメータが暗黙に割当てられたデータ領域に移動され、バイナリ0 (x"00") 文字がコピーデータの最後のスペース以外の文字の直後に置かれる。これは、ヌルで終わるテキスト文字列を使用するC言語のような言語とのインターフェイスを取ることを目的としている。

    6. REPEATED句は、少なくとも整数-1と最終パラメータの整数-2の繰返しがあることを示す。整数-1 TO整数-2が記述されないと、整数-1は0となり、整数-2は無限となる。

10.3 算術式

算術式(arithmetic expression)には、数字基本項目の一意名、数字定数、これらの一意名や定数を算術演算子でつないだもの、2つの算術式を算術演算子でつないだもの、算術式をかっこで囲んだものがある。算術式の前には単項演算子をつけることができる。

以下の記述における、

算術式の中に現れる一意名および定数は、算術演算を行える数字基本項目または数字定数のどちらかを表わしていなければならない。

10.3.1 算術演算子

算術式に使用できる演算子(arithmetic operator)には、5つの2項演算子(binary arithmetic operator)と、2つの単項演算子(unary arithmetic operator)がある。これらの演算子は特定の記号で表わし、前後を空白で区切る。

2項演算子
意味
+ 加算
- 減算
* 乗算
/ 除算
** べき乗

単項演算子
意味
+ 数字定数+1を掛けることと同じ
- 数字定数-1を掛けることと同じ

10.3.2 使用できる要素の組合せ

使用可能な変数、数字定数、算術演算子、およびかっこの組み合わせを表 10-1に示す。

表 10-1: 算術式の中で使用できる要素
最初の要素 2番目の要素
変数 * / ** + - 単項 + - ( )
変数 - P - - P
* / ** + - P - P P -
単項 + - P - - P -
( P - P P -
) - P - - P

P 許される要素の組合わせを示す
- 無効な組合わせを示す
変数 一意名または定数を示す

10.3.3 書き方と評価規則

算術式には、書き方と評価について、以下の規則が適用される。

  1. 算術式の中では、要素が評価される順序を指定するために、かっこを使用できる。かっこ内の式が先に評価される。入れ子になった何組かのかっこについては、最も内側の組を最初にして、順次外側の組へと評価が進む。かっこがない場合、またはかっこ内の要素が同じ水準にある場合、評価順位は下記のようになる。

    1番目 単項演算子の+と-
    2番目 指数
    3番目 乗算と除算
    4番目 加算と減算

    以下に式の評価の例を示す。

     1 + 2 * 3 

    上の式では、最初に乗算(下記)が実行される。

    1. 2 * 3

      次に、乗算の結果、6を使用して加算が実行される。

    2. 1 + 6

      したがって、式の結果は7となる。

  2. かっこを使用する目的は2通りある。1つは、同じ評価順位の演算子がいくつか続く場合に、演算順序の曖昧さをなくすためである。もう1つは、通常の評価順位を変更することである。かっこによって評価順位が指定されない場合、評価順位が同じ一連の演算は、左から右に進められる。

  3. 算術式の先頭には、記号の"("と "+"と " -" または変数だけを書くことができる。算術式の末尾には、記号の")"または変数だけを書くことができる。算術式の中では、左かっこと右かっこは対にする。左かっこが右かっこの左側に来るようにする。

  4. 算術式を使用すると、作用対象の合成(composite of operands)および受取り側データ項目に関する制約を受けずに、算術演算子を組み合わせることができる。たとえば、この章で後述するADD文の構文規則3を参照。

10.3.4 中間結果

式が評価されると、一つ以上の中間結果が出される。概念的に、各中間結果は、一時データ項目として格納され、その値はARITHMETIC指令で選択したパラメーターによって決まる。

ARITHMETIC"MF"指令を選んだ場合、本 COBOL システムは、各中間結果を十進40桁の浮動小数点レジスタに評価する。ゼロでない各中間結果の最上位桁はこのレジスタの最上位桁に位置付けられる。小数点位置は中間結果の値に応じて浮動する。40桁に格納できない桁は切り捨てられる。

ARITHMETIC"TRUNC20" コンパイラ指令を選択すると、Micro Focus COBOLは、ARITHMETIC"MF"を選択した場合と同じ方法で各中間結果を評価する。ただし、20桁を超える小数点の右側の数字は、式の各段階で切り捨てられる。この指令は、COBOL WorkBenchで提供されるものと同様の切り捨てが必要な場合にのみ使用すべきである。 この指令を使用する場合は、INTLEVELコンパイラ指令の初期値、"2"の設定を変えてはならない。これは、一部の新機能(全部で18桁を超える数字PICUTUREなど)をTRUNC20とともに使用できなくなることを意味する。

OS/VS COBOL, VS COBOL II, DOS/VS COBOL, COBOL/370 および OS/390 システムでは、中間結果を、式中の要素のPICTURE句によって決定される精度で計算するので、各バージョンによって多少異なってくる。詳細については、IBM VS COBOL for OS/VSマニュアル、VS COBOL II Application Programming Guide、およびCOBOL for OS/390 & VM V2R2 Programming Guideを参照。各中間結果は、PICTURE 9(n)V9(m) を持つ。n+m の最大値は、選択されたオプションによって 30 または 31 である。

中間結果用にOSVSまたはVSC2オプションを記述した場合、このシステムは以下の制限で、選択されたメインフレームの動作をその結果を適当に切捨てて想定する。

10.4 条件式

条件式(conditional expression)は、実行用プログラムの流れを制御する条件を表わす。条件を評価した結果の真理値に応じて、プログラムの処理の経路が選択される。条件式は、

EVALUATE(評価)、

IF(判断)、PERFORM(実行)、SEARCH(表引き)の各文の中に指定する。条件式は単純条件と複合条件に分類される。どちらの種類の条件も、任意の数のかっこで囲むことができる。かっこで囲んでも、条件の種類は変わらない。

OSVSシステム指令を設定した場合、条件式の中で部分参照を行うことはできない。

10.4.1 単純条件

単純条件(simple condition)には、比較条件、字類条件、条件名条件、スイッチ状態条件、符号条件がある。単純条件は真理値として、「真」または「偽」のどちらかをとる。単純条件をかっこで囲んでも、真理値は変わらない。

10.4.1.1 比較条件

比較条件(relation condition)は、2つの作用対象を比較する。各作用対象には、一意名によって参照されるデータ項目、定数、算術演算によって算出される値を使用できる。比較条件は、作用対象の間に関係が成立するときに、真理値「真」をとる。2つの数字作用対象を、それぞれのUSAGE句に指定されている形式に関係なく、比較できる。その他の比較においては、作用対象の用途は同じでなければならない。作用対象のどちらかが集団項目である場合は、文字の比較規則が適用される。

文字定数をかっこで囲むことができる。

比較条件の一般形式は下記のとおり。

比較文字の">" , "<", "=" は必要語であるが、下線が引かれていないことに注意。これは、"≧" のような他の記号との混同を避けるためである。

" = TO"と " > THAN" と " < THAN" も使用できる。

最初の作用対象(一意名-1、定数-1、算術式-1)を、条件の左辺(subject of condition)と呼ぶ。2番目の作用対象(一意名-2、定数-2、算術式-2)を条件の右辺(object of condition)と呼ぶ。比較条件では少なくとも1つの変数を参照しなければならない。

比較演算子(relational operator)は、比較条件の中で行う比較の種類を指定する。比較演算子としての予約語は、前後を空白で区切らなければならない。 必要語または比較文字の前に"NOT" を付けたものは、1つの比較演算子である。たとえば、"NOT EQUAL" は「等しくない」ことを「真」とすることを表わし、"NOT GREATER" は「以下である」ことを「真」とすることを表わす。各比較演算子の意味を表 10-2に示す。

下記の比較演算子は同義であり、どちらを書いてもよい。:

IS EQUAL TO EQUALS;
IS NOT EQUAL TO IS UNEQUAL TO;
IS GREATER THAN EXCEEDS;
IS NOT GREATER THAN IS LESS THAN OR EQUAL TO;
IS NOT LESS THAN IS GREATER THAN OR EQUAL TO.

表 10-2: 比較演算子
意味
比較演算子
「より大きい」または「以下」  {short description of image}
「より小さい」または「以上」  {short description of image}
「等しい」または「等しくない」  {short description of image}
「より大きい」または「等しい」  {short description of image}
「より小さい」または「等しい」  {short description of image}
「等しい」  {short description of image}
「等しくない」  {short description of image}
「より大きい」  {short description of image}
必要な比較記号、 '<'、'>'、および '=' に下線が引かれない。 これは、"≧" (「以上」)のような他の記号との混同を避けるためである。
10.4.1.1.1 数字作用対象の比較

字類が数字の作用対象に関しては、その代数値が比較される。定数または算術式を表わす数字の数は意味をもたない。ゼロは符号が付いていても付いていなくても、1つの値とみなされる。

これらの作用対象は、その用途がどのように記述されているかにかかわらず、比較することが許される。符号の付いていない数字作用対象は、比較上は、正の数として扱われる。

数字編集項目は、字類が英数字であり、これらの項目は、以下に示す文字作用対象の比較規則に従って比較される。

10.4.1.1.2 文字作用対象の比較

文字作用対象どうしの比較、または1つの数字作用対象と1つの文字作用対象の比較は、指定されている文字の照合順序に基づいて行われる。 (環境部の章の実行用計算機段落節を参照。) 一方の作用対象が数字である場合、整数データ項目または整数定数にする。そして、下記のことに注意する。

  1. 文字作用対象が基本データ項目または文字定数であるならば、数字作用対象は、標準データ形式で同じ大きさの英数字基本データ項目に転記されたように扱われる。そして、この英数字データ項目の内容が、文字作用対象と比較される。(手続き部 - MERGE - OPEN章のMOVE(転記)文節を参照。)

  2. 文字作用対象が集団項目であるならば、数字作用対象は、標準データ形式で同じ大きさの集団項目に転記されたように扱われる。そして、この集団項目の内容が文字作用対象と比較される。(手続き部 - MERGE - OPEN章のMOVE(転記)文節を参照。)

  3. 整数ではない数字作用対象は、文字作用対象とは比較できない。

作用対象の大きさは、作用対象中の標準データ形式文字の合計数である。

表意定数を持つ数字編集データ項目を比較することができる。これは英数字比較として扱われる。

用途が違っていても、数字作用対象と文字作用対象を比較できる。数字作用対象は、標準データ形式で同じ大きさのUSAGE DIAPLAY項目に転記されたように扱われる。そして、この内容が文字作用対象と比較される。

比較処理は2つの場合に分けられる。

  1. 作用対象の大きさが等しい場合: 両方の作用対象の大きさが等しい場合は、上位の文字位置から下位へ向けて、対応する文字が順々に比較される。この比較は、対応する文字を比較して不一致が見つかるか、または作用対象の末尾にまで達した時点で終了する。両方の作用対象が等しいと判定されるのは、最初から最後まで、対応する文字がすべて等しかったときである。

    不一致であった最初の対応する文字は、文字の照合順序を比較される。そして、照合順序の大きい方の文字を含む作用対象の方が大きい作用対象であるとみなされる。

  2. 作用対象の大きさが等しくない場合: 両方の作用対象の大きさが異なる場合は、短い方の作用対象の後ろに、長い方の作用対象と大きさが同じになるまで空白を付け加えたようにみなして、比較が行われる。
10.4.1.1.3 指標名および指標データ項目に関する比較

下記の項目の間でだけ、比較できる。

  1. 2つの指標名。結果は、指標名に対応する出現番号を比較したのと等しい。

  2. 指標名と数字データ項目または数字定数。指標名の値に対応する出現番号が、数字データ項目または数字定数と比較される。

  3. 指標データ名と指標名または他の指標データ項目。実際の値が、変換されることなしに比較される。

  4. 指標名と算術式。指標名の値に対応する出現番号が、式を計算した値と比較される。

  5. 指標データ項目を上記以外のデータ項目または定数と比較すると、結果はどうなるかわからない。

10.4.1.1.4 用途がポインタであるデータ項目に関する比較

用途が明示的にまたは暗黙的に、ポインタとされている2つのデータ項目を比較できる。ポインタの比較では、等しいか等しくないかだけを検査する比較演算子だけを使用できる。

一般形式

構文規則

  1. 一意名-1および一意名-3は、連絡節の中の01レベルまたは77レベルの項目を参照する。

  2. 一意名-1および一意名-3は、データ部の中の任意のデータ項目を参照できる。

  3. 一意名-2および一意名-4は、USAGE IS POINTERと指定されている項目を参照する。

  4. 表意定数 NULLは、1つの作用対象にだけ指定できる。

一般規則

  1. 2つの番地が等しいときに、作用対象は等しいとみなされる。それ以外の場合は、作用対象は等しくないとみなされる。

  2. この種の比較条件は、IF、PERFORM、EVALUATE、およびSEARCH(形式 1)の各文の中で指定できる。形式 2のSEARCH文(SEARCH ALL)の中では、この種の比較条件は使用できない。ポインタ・データ項目は、意味のある順序付けをすることができないからである。

10.4.1.1.5 用途が手続きポインタであるデータ項目に関する比較

用途が手続きポインタである、2つのデータ項目を比較できる。

一般形式

構文規則

  1. 一意名-1および一意名-2は、USAGE IS PROCEDURE-POINTERと指定されている項目を参照する。

  2. 表意定数NULLは、1つの作用対象にだけ指定できる。

一般規則

  1. 2つの番地が等しいときに、作用対象は等しいとみなされる。それ以外の場合は、作用対象は等しくないとみなされる。

  2. この種の比較条件は、IF, PERFORM, EVALUATE, SEARCH(形式 1)の各文の中で指定できる。 形式 2のSEARCH文(SEARCH ALL)の中では、この種の比較条件は使用できない。ポインタ・データ項目は、意味のある順序付けをすることができないからである。

10.4.1.1.6 用途がオブジェクトであるデータ項目に関する比較

2つのオブジェクト参照を比較して、同じオブジェクトを参照しているかを確認できる。

一般形式

構文規則

  1. 表意定数NULLは、1つの作用対象にだけ指定できる。

一般規則

  1. 同じオブジェクトを参照している場合は、作用対象は等しい。そうでない場合は等しくない。

10.4.1.2 字類条件

機能

字類条件(class condition)は、作用対象が数字であるか英字であるか、

あるいは、小文字の英字であるか、大文字の英字であるか、環境部の特殊名段落中にCLASS句によって指定されている文字集合に属する文字だけが含まれるかを、判定する。

一般形式

構文規則

  1. 作用対象の字類は、下記のように判定される。

    1. すべての文字が、0, 1, 2, 3, ... 9から構成される場合、作用対象は数字である。この場合、演算符号の有無は問わない。

    2. すべての文字が、大文字のA, B, C, ...Z、または

      小文字のa, b, c, ...z、

      または大文字

      と小文字 

      および空白の任意の組合わせから構成される場合、作用対象は英字である。

    3. すべての文字が小文字のa, b, c, ...zおよび空白から構成される場合、作用対象は小文字の英字である。

    4. すべての文字が大文字のA, B, C, ...Zおよび空白から構成される場合、作用対象は大文字の英字である。

    5. すべての文字が特殊名段落中の字類名-1の定義に含まれる文字から構成される場合、作用対象は字類名-1に一致する。

  2. 一意名-1は、用途が明示的または暗黙的にDISPLAYであるデータ項目を参照しなければならない。または、NUMERICかどうか検査する場合、用途はDISPLAY、

    COMPUTATIONAL、COMPUTATIONAL-X、

    COMPUTATIONAL-3、

    COMPUTATIONAL-5、

    またはPACKED-DECIMAL

    のどれかとする。

  3. 一意名-1が関数一意名である場合、英数字関数

    または各国語型関数

    を参照しなければならない。

一般規則

  1. 字類条件が語NOTを含まず、一意名-1が長さゼロの集団項目である場合、字類検査の結果は常に偽となる。

    NOTを指定した場合、NOTとこれに続く語は、真理値を導くための字類検査を定義する 1つの字類条件となる。例えば NOT NUMERICは、作用対象が文字であるかを判断する真偽検査である。字類条件が語NOTを含んでいて、一意名-1が長さゼロの集団項目である場合、字類検査の結果は常に真となる。

    長さゼロの集団項目である場合の字類検査の真理値は、ZEROLENGTHFALSE 指令によって予約されている。

  2. NUMERIC検査は、データ記述項に英字と記述されている項目、または符号付き基本項目を含むと記述されている集団項目に対しては、使用できない。検査対象のデータ項目のデータ記述項に演算符号を付けるように記述されていない場合、その内容が数字でかつ演算符号が付いていないときにだけ、そのデータ項目は数字項目であると判定される。 検査対象のデータ項目のデータ記述項に演算符号を付けるように記述されている場合、その内容が数字でかつ有効な演算符号が付いているときにだけ、そのデータ項目は数字項目であると判定される。SIGN IS SEPARATE句が記述されているデータ項目用の有効な演算符号は、標準データ形式文字の"+"と"-" である。SIGN IS SEPARATE句が記述されていないデータ項目用の有効な演算符号は、COBOL言語の概念の章の文字の表現と基数の選定節を参照。

    NUMERIC検査を、データ記述項に演算子が記述されている基本項目から成る集団項目に対して使用できる。

  3. ALPHABET検査は、データ記述に数字であると記述されているデータ項目に対しては、使用できない。検査対象のデータ項目が英字であると判定されるのは、その内容が大文字の英字"A"から"Z" と空白の任意の組合わせ、

    および小文字の英字"a"から"z"

    と空白の任意の組合わせで構成されているときだけである。

    外部浮動小数点数項目(USAGE DISPLAY)および内部浮動小数点数項目(USAGE COMP-1およびUSAGE COMP-2)には、字類条件を使用できない。

  4. ALPHABETIC-LOWER検査は、データ記述に数字であると記述されているデータ項目に対しては、使用できない。 ALPHABETIC-LOWER検査の結果は、一意名-1によって参照されるデータ項目の内容が、すべて小文字の英字"a" から"z" と空白で構成されているときに、真となる。

  5. ALPHABETIC-UPPER検査は、データ記述に数字であると記述されているデータ項目に対しては、使用できない。ALPHABETIC-UPPER検査の結果は、一意名-1によって参照されるデータ項目の内容が、すべて大文字の英字"A" から "Z" と空白で構成されているときに、真となる。

  6. 字類名-1検査は、データ記述に数字であると記述されているデータ項目に対しては、使用してはならない。

10.4.1.3 条件名条件(条件変数)

機能

条件名条件(condition-name condition)は、条件変数(condition variable)の値が条件名に対応する値のどれかと等しいか否かを判定する。

一般形式

構文規則

  1. 条件名に、2バイト文字および内部浮動小数点数を使用できる。

  2. 条件名に、外部浮動小数点数を使用できる。

一般規則

  1. 条件名にいくつかの値の範囲が関係付けられている場合、条件変数の値がその範囲内(境界値を含む)に入るか否かが検査される。

  2. 条件変数と条件名の値を比較する際の規則は、比較条件の場合と同じである。

  3. 条件変数の値が条件名に対応する値の中のどれかに等しければ、検査の結果は真となる。

10.4.1.4 スイッチ状態条件

スイッチ状態条件(switch-status condition)は、

9つある

COBOLスイッチのそれぞれが「オン」の状態にあるか「オフ」の状態にあるかを判定する。

スイッチには、順にSWITCH-0からSWITCH-8という名前が付けられている。

それらの各スイッチの値(「オン」と「オフ」)は、COBOL実行用プログラムの実行を開始するときに、操作員によって設定される。(ランタイムスイッチの詳細については、COBOLシステムのマニュアルを参照。) 条件名に対応するスイッチと「オン」または「オフ」状態は、環境部の特殊名段落の中で定義しておく。環境部の章の特殊名段落節を参照。

一般形式

条件名に定義されている状態にスイッチが設定されていると、検査の結果は真となる。

コンパイラ指令 SWITCH-TYPE を初期値の 1に設定すると、スイッチを設定するランタイム要素の内部からCOBOLスイッチが設定されているかどうかをテストする以外に、スイッチ状態条件を使用することはできない。

コンパイラ指令 DIALECT が ISO2002に設定されると、コンパイラ指令 SWITCH-TYPEが 2に設定される。この場合、実行単位のいずれかのランタイム要素の内部からCOBOLスイッチが設定されているかどうかをテストする以外に、スイッチ状態条件を使用することはできない。

10.4.1.5 正負条件

正負条件(sign condition)は、算術式の値が正か負かゼロかを判定する。 正負条件の一般形式は以下の通り。

正負条件の必要語に "NOT" を付けたものは、1つの正負条件である。この条件に照らして代数検査が行われ、真理値が求められる。たとえば、 "NOT ZERO" は作用対象の値がゼロでない(正または負) のときに真となる。作用対象は、値がゼロよりも大きいときに正であり、値がゼロよりも小さいときに負であり、値がゼロのときゼロである。算術式は、少なくとも1つの変数を参照しなければならない。

符号検査において、ZEROの代わりにZEROSまたはZEROESを使用できる。

10.4.1.6 省略引数条件

省略引数条件で、関数、メソッド、またはプログラムに引数が与えられたかどうかが決定される。

一般形式

データ名-1 IS [ NOT ] OMITTED

構文規則

  1. データ名-1 は、省略引数条件が指定された原始要素で定義された仮パラメータでなければならない。

一般規則

  1. OMITTEDのテスト結果は、以下の場合に真となる。

    1. このプログラム、関数、またはメソッドを起動する文の中のデータ名-1に対応する引数として、 一意名または定数でなく、OMITTED指定が使用されている。

    2. 起動する側の文で、その後に続く引数が省略されており、それがデータ名-1に対応する引数である。

    3. データ名-1に対応する引数自体が、省略引数条件が真の仮パラメータである。

  2. NOT およびキーワード OMITTEDを使用する場合は、これらにより、真の値に対して実行される条件が指定される。

10.4.1.7 INSTANCE-OF条件

INSTANCE-OF条件は、オブジェクト参照が特定のクラスおよびインターフェイスのどちらのインスタンスであるかを決定する。

一般形式

構文規則

  1. オブジェクト一意名-1はオブジェクト参照でなければならない。

  2. クラス名-1は、この原始要素のリポジトリ段落またはクラス制御段落で指定されたクラスの名前でなければならない。

  3. インターフェイス名-1は、この原始要素のリポジトリ段落またはクラス制御段落で指定されたインターフェイスの名前でなければならない。

一般規則

  1. FACTORY指定とONLY指定のどちらも使用しない場合に、オブジェクト一意名-1と名付けられたオブジェクトが、クラス名-1と名付けられたクラスまたはそのサブクラスのインスタンス、およびインターフェイス名-1と名付けられたインターフェイスまたはそのサブインターフェイスのいずれかであれば、INSTANCE-OFテストの結果は真となる。

  2. FACTORY指定を使用し、ONLY指定を使用しない場合に、オブジェクト一意名-1と名付けられたオブジェクトがクラス名-1と名付けられたクラスのファクトリであれば、INSTANCE-OFテストの結果は真となる。

  3. ONLY指定を使用し、FACTORY指定を使用しない場合に、オブジェクト一意名-1と名付けられたオブジェクトがクラス名-1と名付けられたクラスのインスタンスであり、そのサブクラスでなければ、INSTANCE-OFテストの結果は真となる。

  4. FACTORY指定とONLY指定の両方を使用する場合に、オブジェクト一意名-1と名付けられたオブジェクトがクラス名-1と名付けられたクラスのファクトリであり、そのサブクラスでなければ、INSTANCE-OFテストの結果は真となる。

10.4.2 複合条件

複合条件は、論理的結合子(論理演算子、"AND" および "OR")による単純条件、組み合わせ条件、および複合条件の結合、または、これらの条件の論理否定(論理演算子、"NOT")による否定で形成される。複合条件の真の値は、かっこに囲まれているかどうかにかかわらず、単純条件の個々の真の値に関する、記述されたすべての論理演算子の連携、または、論理的に結合または否定された条件の中間の真の値の結果である真の値である。

論理演算子およびその意味は以下のとおりである。

演算子
意味
AND 論理的な結合。真の値は、結合されている条件が真であれば、"真"。結合されている条件の片方または両方が偽であれば、 "偽"。
OR 論理的な包含。真の値は、包含されている条件の片方または両方が真であれば、、"真"。包含されている条件の両方が偽であれば、 "偽"。
NOT 論理的な否定、または真の値の逆。 真の値は、条件が偽であれば、"真"。条件が真であれば、 "偽"。

論理演算子の前後には、空白を入れなければならない。

10.4.2.1 否定単純条件

否定単純条件(negated simple condition)は、単純条件に論理演算子の"NOT" を付けたものである。否定単純条件は、単純条件の真理値を逆転させる働きをする。したがって、単純条件の真理値が「偽」のときに否定単純条件の真理値は「真」となり、単純条件の真理値が「真」のときに否定単純条件の真理値は「偽」となる。否定単純条件は、単純条件の真理値を逆転させる働きをする。したがって、単純条件の真理値が「偽」のときに否定単純条件の真理値は「真」となり、単純条件の真理値が「真」のときに否定単純条件の真理値は「偽」となる。否定単純条件をかっこで囲んでも真理値は変わらない。

一般形式

10.4.2.2 組合せ条件と否定組合せ条件

組合せ条件(combined condition)は、論理演算子の"AND" または "OR" で条件をつないだものである。

一般形式

構文規則

  1. 使用可能な条件は以下の通り。

  2. 組合せ条件の中で "AND" または "OR" のどちらか一方だけを使用するときは、かっこを使う必要はまったくない。しかし、 "AND" と "OR" と "NOT" を混ぜ合わせて使用するときは、かっこを使用することによって、最終的な真理値に影響が出る。

一般規則

  1. 組合せ条件にかっこを指定しないと、論理演算子の優先順位(結合力)に従ってどの論理演算子にどの条件が適用されるかが決まり、それに応じて暗黙的にかっこがあるものと想定される。この優先順位は"NOT","AND" , "OR" の順である。たとえば、「条件-1 OR NOT 条件-2 AND 条件-3」と指定すると、暗黙のうちに「条件-1 OR((NOT 条件-2)AND 条件-3)」と指定したことになる。

  2. 組合せ条件にかっこを指定すると、条件と論理演算子を結合するにあたって、かっこを含めた優先順位が適用される。したがって、かっこを使用すると、論理演算子の通常の優先順位を変えることができる。たとえば、上の例において、「(条件-1 OR(NOT 条件-2))AND 条件-3」と指定すると、意味は変わってくる。(後述の条件評価規則節を参照。)

表 10-3に、条件と条件演算子を結び付け、かっこで囲む有効な組合せを示す。左かっこと右かっこは1対1で対応し、左かっこが右かっこよりも左側にこなければならない。

表 10-3: 条件と論理演算子とかっこの組合せ
要  素 条件式中の位置 直前にきてよい要素 直後にきてよい要素
単純条件 どこでも可 OR, NOT, AND, ( OR, AND, )
OR または AND 最初と最後は不可 単純条件, ) 単純条件, NOT, (
NOT 最後は不可 OR, AND, ( 単純条件, (
( 最後は不可 OR, NOT, AND, ( 単純条件, NOT, (
) 最初は不可 単純条件, ) OR, AND, )

表 からわかるとおり、"OR NOT" は許される組合せであるが、"NOT OR" は許されない組合せである。また、"NOT ( " は許されるが、 "NOT NOT " は許されない)。

10.4.3 略記組合せ比較条件

単純比較条件または否定単純比較条件を、論理結合語で組み合わせていくつも続けて書く場合、先行する比較条件と共通の左辺または左辺と比較演算子があり、かつかっこを使用していなければ、最初のものを除く共通の比較条件を省略できる。下記の2通りの方法がある。

一般形式

一続きの比較条件の中で、上記の両方の形の省略方法を使用できる。略記した場合、先行する明記した最後の左辺が省略した左辺を補うように挿入され、先行する明記した最後の比較演算子が省略した比較演算子を補うように挿入される。 このように暗黙的に左辺および比較演算子が挿入された結果は、表 10-3の規則に合わなければならない。省略した左辺や比較演算子が補われるこの処理は、組合せ条件の中に略記しない単純条件が出てくると終了する。

条件が評価される順序を、かっこを使用することによって変更できる。(下記の例を参照)

略記組合せ比較条件の中で"NOT" を使用した場合、下記のように解釈される。

  1. NOTの直後に GREATER, >, LESS, <, EQUAL, = のどれかが続く場合、NOTは比較演算子の一部と解釈される。ただし、GREATER THAN OR EQUAL TO, >=, LESS THAN OR EQUAL TO, <=は上記の比較演算子に含まれない。

  2. 上記以外の場合、"NOT" は論理演算子として解釈される。したがって、否定比較条件の中に暗黙の左辺または比較演算子が補われる。

略記組合せ比較条件および略記否定組合せ条件と、それに相当する略さない形の例をいくつか下に示す。

略記組合せ比較条件
略さずに書いた場合
a > b AND NOT < c OR d
 
((a > b) AND (a NOT < c)) OR (a NOT < d)
 
a NOT EQUAL b OR c
 
(a NOT EQUAL b) OR (a NOT EQUAL c)
 
NOT a = b OR c
 
(NOT (a = b)) OR (a = c)
 
NOT (a GREATER b OR < c)
 
NOT ((a GREATER b) OR (a < c))
 
NOT (a NOT > b AND c AND NOT d
 
NOT ((((a NOT > b) AND (a NOT > c)) AND (NOT (a NOT > d))))
 
x > a OR y AND z
 
x > a OR (x > y AND x > z)
 
x > a OR (y AND z)
 
x > a OR (x > y AND x > z)
 
x > (a OR y) AND z
 
(x > a OR x > y) AND x > z
 
x ( = a OR > b)
 
x = a OR x > b
 
x = a AND ( > b OR < z )
 
x = a AND ( x > b OR x < z )
 
a EQUAL b OR NOT GREATER OR EQUAL c OR d
 
(a EQUAL b) OR (NOT (a GREATER OR EQUAL c)) OR (a GREATER OR EQUAL d)
 
a EQUAL b OR NOT >=c OR d
 
(a EQUAL b) OR (NOT (a >= c)) OR (a >= d)
 

10.4.3.1 条件評価規則

暗黙的な評価順序を変更する必要があるときは、かっこを使用して、組合せ条件の個々の条件が評価される順序を指定できる。

かっこ内の条件が先に評価される。かっこが入れ子になっている場合は、最も内側のかっこから順次外側へと評価が進められる。かっこが使用されていないかまたはかっこ内の条件が同じレベルにあるときは、下記の暗黙的な階層順序に従って論理評価が進められ、最終的な真理値が決定される。

  1. 条件に算術式または関数が含まれている場合、その条件が評価されるときに、これらの式および関数の値が算出される。同様に、組合せ条件に否定条件が含まれる場合、この組合せ条件を評価する必要があるときに、否定条件が評価される。(前述の書き方と評価規則を参照。)

  2. 単純条件の真理値が、下記の順で決定される。

    比較(略記比較条件があれば、通常の形に展開してから)
    字類
    条件名
    スイッチ状態
    正負

  3. 否定条件の真理値が決定される。

  4. 組合せ条件の真理値が決定される。論理演算子 "AND" が先に評価され、つづいて論理演算子 "OR" が評価される。

  5. 否定組合せ条件の真理値が決定される。

  6. 一連の条件の評価順序がすべてかっこで指定されていない場合、同じレベルの複数の条件は左から右へ評価される。

10.5 多くの文に共通する句と一般規則

以降に説明する各文において、次のような指定が頻繁に出てくる。ROUNDED(四捨五入)指定、ON SIZE ERROR(桁あふれ)指定、

NOT ON SIZE ERROR(桁あふれなし)指定、

CORRESPONDING(対応)指定などである。以下に、これらを個々に説明する。

以降の説明の中で、「結果の一意名」という用語を使用する。これは算術演算の結果を入れる一意名を表わす。

10.5.1 ROUNDED指定

小数点の位置をそろえたとき、算術演算の結果の小数部の桁数が結果の一意名の小数部の桁数よりも大きいと、結果の一意名の大きさに応じて切捨てが発生する。四捨五入が要求されると、あふれる桁の最上位の値が5以上であると、結果の一意名の最下位の桁の絶対値に1が加えられる。

結果の一意名の整数部分の下位がPICTURE文字の "P" を用いて表わされているときには、四捨五入や切捨ては、実際に記憶場所を割り当てられている部分の右端の整数部に対して行われる。

浮動小数点数の算術演算においては、ROUNDED指定は注記として扱われる。浮動小数点数の演算結果は、つねに四捨五入される。

10.5.2 ON SIZE ERROR指定
diala.gifとNOT ON SIZE ERROR指定

小数点の位置をそろえたとき、算術演算の結果の絶対値が対応する結果の一意名がとる最大値を超えると、桁あふれ条件が発生する。除数がゼロである除算が行われると、つねに桁あふれ条件が発生する。ON SIZE ERROR指定を指定しなかったときのゼロによる除算の結果はどうなるかわからないので、注意する必要がある。一般に、桁あふれ条件は最終結果に対してだけ適用される。ただし、MULTIPLY(乗算)文およびDIVIDE(除算)文の場合は、中間結果に対しても桁あふれ条件が適用される。

指数の評価規則から外れると、つねに、算術演算は停止され、桁あふれ条件が発生する。

ROUNDED指定を書くと、四捨五入の後で桁あふれの検査が行われる。その結果桁あふれ条件が発生すると、ON SIZE ERROR指定を指定してあったか否かによって、下記のように処理が分かれる。

10.5.2.1 ON SIZE ERROR指定がない場合

桁あふれ条件が発生すると、対応する結果の一意名の値はどうなるかわからない。この演算処理が実行される間に、桁あふれ条件が発生しなかった結果の一意名の値が、他の結果の一意名に対して発生した桁あふれ条件の影響を受けることはない。

算術演算が終了すると、制御は算術文の末尾に移される。NOT ON SIZE ERROR指定は指定されていても無視される。

除数がゼロの除算の結果は、ON SIZE ERRORを指定していないと、どうなるかわからない。それを避けるためには、CHECKDIVコンパイラ指令と O ランタイムスイッチを使用するとよい。

10.5.2.2 ON SIZE ERROR指定がある場合

桁あふれ条件が発生すると、桁あふれの影響を受ける結果の一意名の値は変更されない。桁あふれ条件の発生しなかった結果の一意名の値が、この演算処理が実行される間に他の結果の一意名に対して発生した桁あふれ条件の影響を受けることはない。 この演算処理が終了すると、ON SIZE ERROR指定内の無条件命令が実行される。

CORRESPONDING指定を伴うADD(加算)文およびSUBTRACT(減算)文に関しては、個々の演算処理において桁あふれ条件が発生しても、その時点ではON SIZE ERROR指定内の無条件命令は実行されない。個々の加算または減算がすべて終了した後に、ON SIZE ERROR指定内の無条件命令が実行される。

桁あふれ条件が発生すると、ON SIZE ERROR指定が指定されていても指定されていなくても、NOT ON SIZE ERROR指定は無視される。

ON SIZE ERROR指定とNOT ON SIZE ERROR指定の両方を指定したときに、実行された方の指定の中に制御を明示的に移す文が含まれていないと、必要があればその指定の実行が終わった時点で、その算術文の末尾に制御が暗黙的に移される。

10.5.2.3 NOT ON SIZE ERROR指定

算術演算文を実行したときに桁あふれ条件が発生しなかった場合にNOT ON SIZE ERROR指定が指定されていれば、その中に記述されている無条件命令が実行される。この場合、ON SIZE ERROR指定が指定されていても無視され、その中に記述されている無条件命令は実行されない。

10.5.3 CORRESPONDING指定

以下の説明で、d1とd2という記号を使用する。このd1とd2はそれぞれ別々の集団項目を指す一意名を表わす。d1とd2から1つずつ取った一組のデータ項目は、下記の条件が満たされるとき対応するという。

  1. d1中のデータ項目およびd2中のデータ項目は、FILLER(無名項目)ではなくデータ名が同じであり、同じように修飾されている。ただし、d1とd2そのものは修飾語に使われていない。

  2. d1中のデータ項目およびd2中のデータ項目は、少なくとも1つが基本項目である。CORRESPONDINGを伴うMOVE(転記)文に関しては、結果として各データ項目に適用される転記は転記規則に合致している。CORRESPONDINGを伴うADD文およびSUBTRACT文に関しては、両方のデータ項目とも基本数字データ項目である。

  3. d1およびd2のデータ記述にレベル番号66、77、

    78

    または88、USAGE IS INDEX句、

    またはUSAGE IS OBJECT句

    が含まれていない。

  4. d1またはd2に属するデータ項目で、そのデータ記述中にREDEFINES、RENAMES、OCCURS、USAGE IS INDEX、

    USAGE IS PROCEDURE-POINTER、

    USAGE IS POINTER、

    またはUSAGE IS OBJECT

    の各句が含まれるものは無視される。また、REDEFINES、RENAMES、OCCURS、USAGE IS INDEX、

    USAGE IS PROCEDURE-POINTER、

    USAGE IS POINTER、

    またはUSAGE IS OBJECT

    の各句が含まれるデータ項目の下位に属するデータ項目も同様に無視される。しかし、d1およびd2のデータ記述中にREDEFINES句またはOCCURS句が含まれていてもよい。あるいは、データ記述中にREDEFINES句またはOCCURS句が含まれるデータ項目の下位にd1およびd2が属していてもよい。

    d1もd2も、部分参照できない。

  5. 上記の条件を満たす各データ項目の名前は、暗黙の修飾を使用した後では、一意でなければならない。

10.5.4 算術文

算術文には、ADD、COMPUTE、DIVIDE、MULTIPLY、SUBTRACTがある。これらの文には、下記の共通の特徴がある。

  1. 作用対象のデータ記述は、同じである必要はない。必要に応じて、データ形式の変換および小数点の位置合わせが行われる。

  2. 作用対象の合成とは、指定された各作用対象の小数点の位置を合わせて重ね合わせできる、仮想のデータ項目である。

    ADD、DIVIDE、MULTIPLY、およびSUBTRACT文の作用対象の合成は、18桁を超えてはならない。

    作用対象の合成についての制限はない。

10.5.5 作用対象の重なり

ある文の送出し側項目と受取り側項目とが記憶領域の一部を共有するときで、

同じデータ記述項目によってまだ定義されていない場合、

その文を実行した結果はどうなるかわからない。

重なりの転記は、MOVE文が使用され、作用対象が部分参照も添え字も使用していない場合にだけ、翻訳時に検出される。コンパイラ指令WARNING"3"を設定してある場合、前方への重なりの転記があると警告メッセージが出される。 コンパイラ指令FLAG"方言"を設定してある場合、その他のタイプであればフラグメッセージが出される。ただし、OSVS以外の"方言"とする。同じ記憶域を共有する項目を送受信する他の操作は、検出されない。

COBOL原始コードの移植性は、原始プログラム内でMOVE文の重なりが起きない時にだけ保証されるが、このCOBOLシステムはこのような文を認めていない。このような文の動作は、BYTE-MODE-MOVE指令の指定により変わる。

10.5.6 算術文における複数個の結果

ADD、COMPUTE、DIVIDE、MULTIPLY、SUBTRACTの各文は複数個の答をもつことがある。これらの文は、下記のように書かれたものとして実行される。

  1. 初期評価部分のすべてのデータ項目を演算処理し、その結果を一時的に記憶し、その一時結果を使用して必要なすべての演算を行い、受取り側項目に答を収める。

  2. 中間結果を記憶する領域を利用して、一連の作用対象を順々に取り上げて演算を施し、最終的に1つの答を得る。この形の文は、列挙されている複数の作用対象を左から右に順々に取り上げて、別々の文で記述したものとみなされる。

    例1:

    ADD a, b, c TO c, d (c), e

    は、下記のように書いたのと等しい。

    ADD a, b, c GIVING temp
    ADD temp TO c 
    ADD temp TO d (c) 
    ADD temp TO e

    例2:

    MULTIPLY a(i) BY i, a(i)

    は、下記のように書いたのと等しい。

    MOVE a(i) to temp
    MULTIPLY temp by i 
    MULTIPLY temp BY a(i)

    ここで、temp はCOBOLコンパイラによって使用される、中間結果を一時的に記憶する場所である。

10.5.7 矛盾するデータ

字類条件 (前述の字類条件節を参照) の中で参照された場合は除いて、手続き部で参照されたデータ項目の内容が、そのデータ項目のPICTURE句)、

または関数定義

に指定されている字類と合わないと、そのデータ項目を参照した結果はどうなるかわからない。

数字項目を参照したところ、その項目に文字または無効なデータが含まれていた場合、結果はどうなるかわからない。このような条件は、実行時に検出されてエラーとされる。この動作は、F ランタイムスイッチの影響を受ける。

英字項目を参照したところ、その項目に英字でないデータが含まれていた場合、プログラムの実行は続けられるが、結果はどうなるかわからない。

10.5.8 符号付き受取り側項目

算術文またはMOVE文中の受取り側項目が、符号付きの数字または数字編集項目である場合、受取り側項目に符号が転記される。この符号の転記は、数字データの絶対値が切り捨てられたか否かに関係なく行われる。したがって、数値はゼロであるが、符号が負ということが起こり得る。

10.6 ファイル入出力の概要

10.6.1 ファイル位置指示子

ファイル位置指示子(file position indicator)は、ファイルに一連の入出力操作を施している際に、次に呼び出されるレコードを指す働きをする。ファイル位置指示子の設定に影響する文は、CLOSE, OPEN, START, READだけである。出力モードまたは拡張モードで開かれたファイルに対しては、ファイル位置指示子は影響を及ぼさない。

10.6.2 入出力状態

ファイル管理記述項にFILE STATUS句を指定すると、ファイル入出力操作の結果を示す2文字のデータ項目がとられる。OPEN, CLOSE, READ, WRITE, DELETE, UNLOCK, STARTの各文を実行すると、その 結果を示す値がこのデータ項目に設定される。実行する条件に該当するUSE手続きがある場合、それが実行される前にこの値が設定される。

以下に記述するファイル状態キーは、ANSI標準に全面的に準拠したものであるとともに、このCOBOLシステムで使用できる拡張機能を、何も使用していないファイルに関するものである。

たとえば、拡張機能を使用してファイルをLINE SEQUENTIALと指定すると、返される状態キーに影響が出る。詳しいことは関連する動詞の箇所に説明してある。

10.6.2.1 状態キー 1

FILE STATUSデータ項目の左端の文字を、状態キー1という。どのような編成のものでも、ファイルの入出力操作が終了すると、このデータ項目に下記の条件のどれかを示す値が設定される。

"0" - 正常終了(successful completion)
"1" - ファイル終了(at end)
"2" - 無効キー(invalid key)
"3" - 永続誤り(permanent error)

"4"

- 論理誤り(logic error)
"9" - ランタイム・システム・エラーメッセージ(run-time system error message)

上記の各条件の意味は下記のとおり。

"0" 正常終了: 入出力文の実行が正常に完了した。
"1" ファイル終了: 順呼出しのREAD文の実行が不成功に終わった。その理由は2通りある。ファイル中に次の論理レコードが存在しない。または、OPTIONAL句が記述されているファイルに対して最初のREAD文が実行されたが、 OPEN文を実行した時点でそのファイルがそのプログラムで利用可能でなかった。
"2" 無効キー: 順ファイルでないファイルに対する入出力文の実行が不成功に終わった。その理由としては、下記のものがある。

順序に誤りがある
重複キーがある
レコードが見つからない
区域外書き出しが行われた

"3" 永続誤り: 入出力文の実行が不成功に終わった。その理由は2通りある。 順ファイルに対して区域外書き出しが行われた。または、奇偶検査誤りや伝送誤りのような入出力誤りがあった。
"4"

論理誤り: 入出力文の実行が不成功に終わった。その理由は2通りある。ファイルに対する入出力操作の順序が不適切である。 または、利用者によって設定されている制限を超えた処理が行われた。

"9" ランタイム・システム・エラーメッセージ: ランタイム・システムによって定義されているエラーメッセージ条件が発生したために、入出力文の実行が不成功に終わった。状態キー1または状態キー1と状態キー2の組合せによって予め定義されている条件に該当しない条件が発生した場合にだけ、この状態値が使用される。

10.6.2.2 状態キー 2

FILE STATUSデータ項目の右端の文字を、状態キー2という。状態キー2は入出力操作の結果の、さらに詳細を示すために使用される。

状態キー1と状態キー2の組合せによって、入出力操作の結果が下記のように細かく定義される。

正常終了

状態キー1の値が"0" で、入出力操作が正常に終了したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"0" (すべてのファイル)それ以上詳しい情報はない。
"2" (索引ファイルだけ)下記の2通りの可能性を示す。

  • READ文で読み込んだレコードの参照キーの値が、その索引における次のレコードの参照キーと等しい。

  • WRITE文またはREWRITE文によって書かれたレコードの副レコードキーの値が、最低1つ既にファイルに存在している。ただし、その副レコードキーには重複が許されている。
"4"

(すべてのファイル)処理したレコードの長さが、そのファイルのファイル固有属性に従っていない。

"5"

(すべてのファイル)OPEN文が実行されたとき、参照した不定ファイルが存在しない。

"7"

(レコード順ファイルだけ)NO REWIND, REEL/UNIT, FOR REWINDのどれかの指定を伴うCLOSE文、またはNOREWIND指定を伴うOPEN文が実行されたが、対象となったファイルはリール/ユニット媒体ではない。

ファイル終了条件による不成功

状態キー1の値が"1" で、ファイル終了条件(at end condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"0"

(すべてのファイル)次の論理レコードが存在しないことを示す。この条件が発生する場合は下記の2通りある。

  • ファイルの末尾に到達した。

  • 不定入力ファイル(optional input file)に対して、順呼出しREAD文が初めて実行されたが、対象とするファイルが存在しない。
"4"

(相対ファイルだけ)使用された相対レコード番号の桁数が、ファイル用に定義されている相対キーデータ項目の桁数よりも大きい。

無効キー条件による不成功

状態キー1の値が "2" で、無効キー条件(invalid key condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"1" 索引ファイルを順呼び出しした場合)順序誤り(sequence error)があったことを示す。その原因は、次の2通りある。連続するキーの値が昇順になっていなかった。 (手続き部 - SEARCH - XML PARSEの章のWRITE(書き出し)文節を参照。)または、READ文が正常に実行されてからREWRITE文が実行されるまでの間に、そのファイルの主レコードキーが変更された。
"2" (相対ファイルおよび索引ファイルだけ)キーの値が重複することを示す。その原因は、次の2通りある。主レコードキーの値が重複になるレコードを書き込もうとした。または、副レコードキーにDUPLICATES指定がなされていないのに、副レコードキーの値が重複になるレコードを書き込みまたは書き換えようとした。
"3" (相対ファイルおよび索引ファイルだけ)レコードが見つからなかったことを示す。その原因は、次の2通りある。レコードを呼び出すときに指定したキーに対応するレコードが、ファイル中に存在しなかった。または、不定入力ファイルに対してSTART文またはREAD文を実行したが、対象とするファイルが存在しなかった。
"4" 相対ファイルおよび索引ファイルだけ)区域外書き出し(boundary violation)条件が発生したことを示す。その原因は、次の2通りある。

  • 外部的に定義されているファイル境界を超えて、レコードを書き込もうとした。

  • 相対ファイルに対して順書き込みのWRITE文が実行されたが、使用された相対レコード番号の桁数が、ファイに定義されている相対キーデータ項目の桁数よりも大きい。

永続誤り条件による不成功

状態キー1の値が"3" で、永続誤り条件(permanent error condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"0" (すべてのファイル)誤りの原因について、それ以上詳しい情報はないことを示す。
"4" (順ファイルだけ)区域外書き出し条件が発生したことを示す。つまり、外部的に定義されているファイル境界を超えて、レコードを書き込もうとした。
"5" (すべてのファイル)INPUT、I-O、またはEXTENDのどれかの指定を伴うOPEN文が実行されたが、対象となる不定でないファイルが存在しないことを示す。
"7" EXTENDのどれかの指定を伴うOPEN文が実行されたが、対象となる不定でないファイルが存在しないことを示す。 その理由には下記のものがある。

  • EXTEND指定またはOUTPUT指定がなされたが、対象となるファイルには出力操作を行うことはできない。

  • I-O指定がなされたが、対象となるファイルには入出力両用モードで開かれた相対ファイル適用できる入出力操作を行うことはできない。

  • INPUT指定がなされたが、対象となるファイルには入力操作を行うことはできない。
"8" (すべてのファイル)閉じてロック(施錠)されているファイルに対して、OPEN文を実行しようとしたことを示す。
"9" (レコード順、相対、索引ファイル)ファイル固有属性(fixed file attribute)とプログラム中でファイルに対して指定された属性との間に、矛盾が検出されたことを示す。

論理誤り条件による不成功

状態キー1の値が "4" で、論理誤り条件(logic error condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"1" (すべてのファイル)既に開かれているファイルに対して、OPEN文を実行しようとしたことを示す。
"2" (すべてのファイル)開かれていないファイルに対して、CLOSE文を実行しようとしたことを示す。
"3" (すべてのファイルに関して、順呼出しの場合だけ)DELETE文またはREWRITE文を実行しようとしたが、その直前の入出力操作としてREAD文が実行され正常終了していない。
"4" (レコード順ファイルだけ)区域外書き出しが発生したことを示す。その原因として考えられるのは、対象のファイルのRECORD IS VARYING句によって認められている最大レコードよりも長いか最小レコードよりも短いレコードを、WRITEまたはREWRITEしようとしたことである。
"5" (すべてのファイル)ファイルのレコードをREWRITEしようとしたが、元のレコードの大きさと書き換えレコードの大きさが等しくない。

行順ファイルの場合、このレコードの大きさは、空白を除去しタブを圧縮し空文字を挿入した後のレコードの物理的な大きさを指す。この場合、新しいレコードの物理的な大きさが元のレコードよりも小さくなってもよい。

"6" (すべてのファイル)入力モードまたは入出力両用モードで開かれているファイルに対して、順呼出しのREAD文を実行しようとしたが、有効な次のレコードが存在しないことを示す。その原因としては、下記のものがある。

  • 先行するSTART文が不成功であった。

  • 先行するREAD文がファイル終了以外の条件で不成功であった。

  • 先行するREAD文によってファイルの末尾に達した。
"7" (すべてのファイル)入力モードまたは入出力両用モードで開かれていないファイルに対してREAD文またはSTART文を実行しようとしたことを示す。
"8" (すべてのファイル)入出力両用モード、出力モード、拡張モードのどれかで開かれていないファイルに対してWRITE文を実行しようとしたか、または順呼出し法の入出力両用モードで開かれたファイルに対してWRITE文を実行しようとしたことを示す。
"9" (すべてのファイル)入出力両用モードで開かれていないファイルに対して、DELELTE文またはREWRITE文を実行しようとしたことを示す。

ランタイム・システムによるエラーメッセージ

状態キー1の値が" 9" で、作成者が定義したエラーメッセージが発生したことが示されている場合、 状態キー2には該当するエラーメッセージ番号が2進数で設定される。エラーメッセージについて詳しくは、使用しているCOBOLシステムのマニュアルを参照。

10.6.2.3 状態キー1と2の有効な組合わせ

以下の表で、 "S" はレコード順ファイル、

"L " は行順ファイル、

"R" は相対ファイル、"I" は索引ファイルを示す。

表 10-4中の状態キー1の行と状態キー2の列が交差する部分に文字が記されている場合に、そのファイル編成に関してその状態キー1と状態キー2の組合せが有効である。

表 10-4:状態キー1と2の有効な組合わせ
状態キー 1 状態キー 2
0 1 2 3 4 5 6 7 8 9
正常終了 0 SRIL   I   SRIL SRIL   S    
ファイル終了 1 SRIL       R          
無効キー 2   I RI RI RI          
永続誤り 3 SRIL       SL SRIL   SRIL SRIL SRI
論理誤り 4   SRIL SRIL SRIL SRIL   SRIL SRIL SRIL SRIL
作成者定義 9 ランタイムシステムのエラーメッセージ (SRIL)

10.6.3 ファイル終了条件

READ文を実行した結果、ファイル終了条件が発生することがある。その原因の詳細については、手続き部 - PERFORM - ROLLBACK の章のREAD(読み込み)文節を参照。

10.6.4 無効キー条件

START文、READ文、WRITE文、REWRITE文、DELETE文を実行した結果、無効キー条件が発生することがある。その原因の詳細については、手続き部 - PERFORM - ROLLBACK の章のREAD(読み込み)文 およびREWRITE(書き換え)文手続き部 - SEARCH - XML PARSEの章のSTART(開始)文 および WRITE(書き出し)文の各節を参照。

入出力文に指定された入出力操作が実行された後で無効キー条件が発生すると、下記の動作が記してある順に行われる。

  1. 該当ファイルにFILE STATUSデータ項目を指定してあると、そこに無効キー条件の内容を示す値が設定される。(前述の入出力状態の節を参照。)

  2. 無効キー条件を引き起こした文の中にINVALID KEYを指定してあると、制御はINVALID KEY指定中の無条件文に移される。該当ファイルにUSE手続きが指定されていても、実行されない。

  3. 無効キー条件を引き起こした文の中にINVALID KEYを指定しないで、該当ファイルにUSE手続きが明示的または暗黙的に指定されていると、その手続きが実行される。

無効キー条件が発生すると、そのことを認識する入出力文は不成功となる。この場合、ファイルは影響を受けない。

状態キー1に"9" が設定されたときは、INVALID KEY指定によって誤りが捕らえられるのではないことに注意。この場合は、明示的に状態キーを検査するか、または宣言部分を使用して、別途誤りを捕られなければならない。

10.6.5 マルチユーザーシステム上でのファイルの共有

ランタイムシステム(RTS)では、このCOBOLシステムのマルチユーザー機能をサポートしている。このマルチユーザー機能によって、マルチユーザー環境下で利用者がファイルを共有すること、あるプログラムがデータを更新する間は他のプログラムが該当するファイル全体またはそのレコードをアクセスできないようにすることが可能になる。

シングルユーザー環境下では、マルチユーザー用の構文は実行時に効力を発揮しない。しかし、シングルユーザーとマルチユーザーの両方の環境で使用できるように、プログラムを作成しておくことができる。

ファイルはアクティブか非アクティブのどちらかの状態をとる。アクティブ・ファイルとはいくつかの実行単位に対して開かれているものである。非アクティブ・ファイルとはどの実行単位に対しても開かれていないものである。

アクティブ・ファイルには、排他モード(exclusive mode)と共有モード(sharable mode)の2つのモードがある。

ファイルの共有方法は、以下に示すファイル構成に影響される。

ファイルへのアクセスを共有する各実行単位は、そのファイル中の単一のレコードまたは複数のレコードをロックすることができる。ただし、1つの実行単位が同じファイルに対して、単一レコードのロックと複数レコードのロックの両方を選択することはできない。

10.6.5.1 単一レコードのロック

あるファイルに対して(明示的にまたは暗黙的に)単一レコードのロックを指定した実行単位は、一時点ではそのファイル中の1レコードだけをロックできる。実行単位がレコードロックを獲得する方法には、手動と自動の2通りがある。

ロック解除はロックした実行単位によって、下記のどれかの方法によって行われる。

10.6.5.2 複数レコードのロック

ファイル編成が相対か索引かレコード順の場合にだけ、複数レコードをロックできる。

複数レコードをロックすることを指定した実行単位は、1つのファイル中で同時に何件ものレコードロックを保持できる。他の実行単位は、ロックされているレコードを更新したりロックしたりすることができなくなる。しかし、他の実行単位がロックされていないレコードへのアクセスを拒否されるわけではない。実行単位がレコードロックを獲得する方法には、手動と自動の2通りがある。

ロック解除はロックした実行単位によって、下記のどれかの方法によって行われる。

10.6.5.3 省略時解釈のレコードロック

表 10-5、10-6、および10-7 に、ファイル編成別にファイルをオープンするモードごとの省略時解釈のロック型を示す。 この省略時解釈のロック型は、 プログラムをCOBOLに投入するときにAUTOLOCK指令を設定することによって、変更できる 。また、表には、個々のファイルごとに、省略時解釈のロック型を変更することができるか否かについても示す。ファイルごとにロック型を変更するには、そのファイルのSELECT句中に適切な句を挿入する 。(構文の詳細については、環境部の章のファイル管理記述項節を参照。)

X/Open では、自動ロックでの単一レコードロック、またはマニュアルロックでの複数レコードロックのどちらかを使用する原始プログラムに従う X/Open を制限している。

表 10-5: レコード順ファイルの省略時解釈のロック型
開くモード 指令なし AUTOLOCKコンパイラ
指令
SELECT文での変更
INPUT ロックなし ロックなし 可、ただし排他へだけ
I-O 排他 単一レコードのロック
OUTPUT 排他 排他 不可
EXTEND 排他 ロックなし 可、ファイルを共有可できるがレコードはロックできない
表 10-6: 行順ファイルの省略時解釈のロック型
開くモード 指令なし AUTOLOCKコンパイラ指令
SELECT文での変更
INPUT ロックなし ロックなし 不可
I-O 排他 ロックなし 不可
OUTPUT 排他 排他 不可
EXTEND 排他 ロックなし 不可
表 10-7: 相対ファイルおよび索引ファイルの省略時解釈のロック型
開くモード 指令なし AUTOLOCKコンパイラ指令
SELECT文での変更
INPUT ロックなし ロックなし 可、ただし排他へだけ
I-O 排他 単一レコードの自動ロック
OUTPUT 排他 排他 不可
EXTEND 排他 排他 不可


注:

  1. 出力用に開いたファイルは、指定したロックのモードにかかわりなく、排他モードとされる。

  2. プログラマは、省略時解釈のロック方式(表 4-15, 4-16, 4-17を参照)を受け入れるか、またはファイル管理記述項にLOCK MODE句 (環境部ファイル管理記述項節を参照) を含めるかして、ロックの型を選択できる。


10.7 パラメータと戻り項目の適合

パラメータと戻り項目の適合規則は、構文規則から明示的な参照が行われる翻訳時に適用される。


注:翻訳時にパラメータと戻り項目の適合規則におり、以下がチェックされる。


10.7.1 パラメータ

起動する側の要素の中の引数の数は、起動される側の要素の中の仮パラメータの数と同じでなければならない。

ただし、後に置かれる仮パラメータで、起動される側の要素の手続き部見出しでOPTIONALにより指定され、起動する側の要素の引数のリストでは省かれているものを除く。

作業対象の数が同じではなく、起動する側の文の方がその数が多い場合は、それらは無視される。また、手続き部見出しの方が作用対象の数が多い場合は、ランタイム要素の中でそれらが参照されなければならない。位置的な対応関係は、呼び名で暗黙的に指定されるCOBOL以外の呼出し規則により異なる。作用対象の数の相違は、実行時以外にはわからないため、指令 FLAG によりこの拡張にフラグがつけられることはない。

引数と仮パラメータの適合規則は、仮パラメータまたはそれに対応する引数が集団項目であるか、またはその両方が基本項目であるかどうかにより異なる。

10.7.1.1 集団項目

仮パラメータまたは引数が集団項目である場合、対応する引数または仮パラメータは集団項目、または項類が英数字の基本項目でなければならない。さらに、仮パラメータは、対応する引数と同じか、それより少ない文字位置で記述されなければならない。

10.7.1.2 基本項目

基本項目の適合規則は、引数が参照、内容、および値のどれにより渡されるかにより異なる。

10.7.1.2.1 参照により渡される基本項目

仮パラメータまたはそれに対応する引数がオブジェクト参照の場合、対応する引数または仮パラメータは、以下の規則に従うオブジェクト参照でなければならない。

  1. 引数または仮パラメータが一般的オブジェクト参照の場合、対応する仮パラメータまたは引数は一般的オブジェクト参照でなければならない。

  2. 引数または仮パラメータをインターフェイス名で記述した場合、対応する仮パラメータまたは引数は、インターフェイス名で記述しなければならない。

  3. 引数または仮パラメータをクラス名で記述した場合、対応する仮パラメータまたは引数は、同じクラス名で記述しなければならない。さらに、FACTORYおよびONLYを同様に指定しなければならない。

  4. 仮パラメータをACTIVE-CLASS指定で記述した場合、以下の条件のいずれかが真でなければならない。

    1. 引数が、ACTIVE-CLASS指定で記述されたオブジェクト参照である。ここで、FACTORY指定の有無は仮パラメータと同じである。さらに、起動されるメソッドは、定義済みのオブジェクト参照 SELFまたはSUPER、またはACTIVE-CLASS指定で記述されたオブジェクト参照で呼び出される。

    2. 引数が、クラス名およびONLY指定で記述されたオブジェクト参照である。ここで、FACTORY指定の有無は仮パラメータと同じである。さらに、起動されるメソッドは、そのクラス名、またはそのクラス名とONLY指定で記述されたオブジェクト参照で呼び出される。

引数または仮パラメータがクラスポインタのものである場合、対応する仮パラメータまたは引数はクラスポインタのものでなければならない。さらに、対応する項目は同じ項類でなければならない。どちらかのポインタが制限付きポインタであれば、両方とも制限付きで同じ種類のポインタでなければならない。特殊レジスタ ADDRESSは、クラスポインタのもので、かつ、項類データポインタと見なされる。

引数または仮パラメータのどちらもクラスオブジェクトのものでもクラスポインタのものでない場合の適合規則は以下の通り。

  1. 起動される側の要素であるプログラムに対し、起動する側の要素のリポジトリ段落中のプログラム指定子がなく、CALL文に指定されたNEST指定がない場合、仮パラメータは、対応する引数と同じ長さでなければならない。

  2. 起動される側の要素が以下のいずれかの場合、仮パラメータの定義および引数の定義に、PICTURE、USAGE、SIGN、JUSTIFIED、およびBLANKの各句が同様に含まれなければならない。

    • 起動する側の要素中のリポジトリ段落に、そのプログラム指定子のないプログラム

    • NEST指定を含むCALL文で呼び出されたプログラム

    • メソッド

    • 関数

    ただし、以下の場合は例外とする。

    1. 通貨記号が一致する。ただし、対応する通貨文字列が同じ場合に限る。

    2. 終止符PICTURE記号が一致する。ただし、起動する側と起動される側の両方のランタイム要素について、DECIMAL-POINT IS COMMA句が有効または無効である場合に限る。

    3. コンマPICTURE記号が一致する。ただし、起動する側と起動される側の両方のランタイム要素について、DECIMAL-POINT IS COMMA句が有効または無効である場合に限る。

    さらに、以下の規則が適用される。

    1. 仮パラメータをANY LENGTH句で記述した場合、その長さは対応する引数の長さと一致すると見なされる。

    2. 引数をANY LENGTH句で記述した場合、対応する仮パラメータをANY LENGTH句で記述するものとする。

10.7.1.2.2 内容または値により渡される基本項目

仮パラメータが、ACTIVE-CLASS指定で記述されたオブジェクト参照の場合、以下の条件のいずれかが真でなければならない。

  1. 起動されるメソッドは、定義済みのオブジェクト参照 SELFまたはSUPER, 、またはACTIVE-CLASS指定で記述されたオブジェクト参照により呼び出される。さらに、起動する側の要素でSET文が有効である。この要素には、送出し側の作用対象として引数が、受取り側の作用対象としてACTIVE-CLASS指定で記述されたオブジェクト参照が含まれる。このオブジェクト参照でのFACTORY指定の有無は、仮パラメータでの有無と同じとする。

  2. 起動されるメソッドは、クラス名またはクラス名で記述されたオブジェクト参照により呼び出される。さらに、起動する側の要素でONLY指定およびSET文が有効である。この要素には、送出し側の作用対象として引数が、受取り側の作用対象としてクラス名とONLY指定で記述されたオブジェクト参照が含まれる。このオブジェクト参照でのFACTORY指定の有無は、仮パラメータでの有無と同じとする。

仮パラメータがクラスポインタのもの、またはACTIVE-CLASS指定を用いずに記述されたオブジェクト参照である場合、その適合規則は、SET文が、実行する側のランタイム要素で実行されたときと同じとなる。このとき、送出し側作用対象は引数とし、受取り側作用対象は対応する仮パラメータとする。

仮パラメータがクラスオブジェクトのものでもクラスポインタのものでない場合の適合規則は以下の通り。

  1. 起動される側の要素であるプログラムに対し、起動する側の要素のリポジトリ段落中のプログラム指定子がなく、CALL文に指定されたNEST指定がない場合、仮パラメータは、対応する引数と同じ数の文字位置で記述しなければならない。

  2. 起動される側の要素が以下のいずれかの場合の適合規則は、仮パラメータの種類により異なる。

    • 起動する側の要素中のリポジトリ段落に、そのプログラム指定子のないプログラム

    • NEST指定を含むCALL文で呼び出されたプログラム

    • メソッド

    • 関数

    仮パラメータの種類と各適合規則は以下の通り。

    1. 仮パラメータが数字である場合の適合規則は、送出し側作用対象としての引数と、受取り側作用対象としての対応する仮パラメータを含むCOMPUTE文に対するものと同じとする。

    2. 仮パラメータが索引データ項目またはポインタデータ項目の場合、適合規則は、送出し側作用対象としての引数と、受取り側作用対象としての対応する仮パラメータを含むSET文に対するものと同じとする。

    3. 仮パラメータがANY LENGTH句で記述されている場合、その長さは、対応する引数の長さに一致すると見なされる。

    4. 上記のどれでもない場合、適合規則は、送出し側作用対象としての引数と、受取り側作用対象としての対応する仮パラメータを含むMOVE文に対するものと同じとする。

10.7.2 戻り項目

戻り項目は、起動する側の文で指定しなければならない。ただし、戻り項目が、起動される側の要素の手続き部見出し、

またはENTRY文

で指定される場合に限る。関数または行内メソッド呼出しが参照されるときは、戻り値が、起動する側の要素で暗黙的に指定される。

起動される原始要素中の戻り値は送出し側の作用対象であり、起動する側の原始要素中の対応する戻り値が受取り側作用対象である

送出し側の作用対象と受取り側作用対象の間の適合規則は、それらの作用対象の少なくとも1つが英数字集団項目であるか、または両方が基本項目であるかどうかにより異なる。

10.7.2.1 集団項目

送出し側と受取り側作用対象のどちらかが集団項目の場合、対応する戻り項目は集団項目、または項類が英数字の基本項目でなければならない。また、受取り側作用対象は、送出し側作用対象と同じ数の文字位置で記述しなければならない。


注:起動する側の要素中の戻り項目が1以外のレベル番号の集団項目で、その下位の項目の記述により、使用されると意味のないビットまたはバイトが挿入される場合は、下位の基本項目の配置が、起動する側のランタイム要素中の戻り項目と起動されるランタイム要素中の戻り項目の間で対応しない場合がある。


変数反復データ項目として記述された作用対象には、最大長が使用される。

10.7.2.2 基本項目

変数反復データ項目として記述された作用対象については、最大長が使用される。

  1. 起動される原始要素中の戻り項目の記述にACTIVE-CLASS指定が含まれない場合、適合規則は、SET文が、起動されるランタイム要素で実行されたときと同じとなる。このとき、送出し側作用対象は起動される原始要素中の戻り項目とし、受取り側作用対象は起動する側の原始要素中の対応する戻り項目とする。

  2. 起動される原始要素中の戻り項目の記述にACTIVE-CLASS指定が含まれる場合、適合規則は、SET文が、起動されるランタイム要素で実行されたときと同じとなる。このとき、受取り側作用対象は起動する側の原始要素中の戻り項目とし、送出し側作用対象は以下の規則に従ってUSAGE OBJECT REFERENCEで記述されるものとする。

    1. 起動されるメソッドがクラス名で呼ばれる場合、送出し側作用対象は同じクラス名とONLY指定で記述される。

    2. 起動されるメソッドが定義済みオブジェクト参照 SELFまたはSUPER、

      またはSELFCLASS

      で呼ばれる場合、送出し側作用対象はACTIVE-CLASS指定で記述される。

    3. 起動されるメソッドが、インターフェイス名で記述されたオブジェクト参照で呼ばれる場合、は一般的オブジェクト参照とする。

    4. 起動されるメソッドがその他のオブジェクト参照で呼ばれる場合、この一意名が送出し側作用対象として使用される。この場合、用いられていれば、ONLY指定も含まれる。

    5. 上記の規則の適用により選択された送出し側作用対象がクラス名またはACTIVE-CLASS指定で記述されている場合、FACTORY指定の有無は、起動される原始要素の戻り項目での有無と同じとする。

送出し側作用対象がオブジェクト参照でない場合、受取り側作用対象は同じPICTURE、USAGE、SIGN、SYNCHRONIZED、JUSTIFIED、およびBLANK句を含むものとする。ただし、以下の例外がある。

  1. 通貨記号が一致する。ただし、対応する通貨文字列が同じ場合に限る。

  2. 終止符PICTURE記号が一致する。ただし、起動する側と起動される側の両方のランタイム要素について、DECIMAL-POINT IS COMMA句が有効または無効である場合に限る。.

  3. コンマPICTURE記号が一致する。ただし、起動する側と起動される側の両方のランタイム要素について、DECIMAL-POINT IS COMMA句が有効または無効である場合に限る。

さらに、以下の規則が適用される。

  1. 受取り側作用対象をANY LENGTH句で記述した場合、送出し側作用対象もANY LENGTH句で記述しなければならない。

  2. 送出し側作用対象をANY LENGTH句で記述した場合、送出し側作用対象の長さは受取り側作用対象の長さと一致すると見なされる。


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標および商品名は国際法によって保護されています。


Previous データ部 - 画面節 手続き部 - 組み込み関数 Next