前ページへ データ部 - 画面節 手続き部 - 組み込み関数 次ページへ

第10章: 手続き部

10.1 手続き部

手続き部(procedure division)は、COBOL 原始プログラム中に任意で記述する。プログラム定義では、オブジェクトプログラム内で実行する手続きを含む。これらの手続きは、宣言しても、宣言しなくてもよい。呼出しプロトタイプでは、宣言した、または宣言しない手続きをどちらも含まない。ただし、ENTRY文は含んでも構わない。

宣言節は、手続き部の最初で集団にしなければならない。これを以下の一般形式の書き方 1に示す。

一般形式

書き方 1

書き方 2

書き方 3
PROCEDURE DIVISION. 
[ DECLARATIVES. 
{ 節名 SECTION. 
               宣言完結文. 
[ 完結文 ] … [ 段落名. [ 完結文 ] … ] … } … 
END DECLARATIVES. ] 
[ { メソッド定義 } … ]  

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

上記の 宣言完結文(declarative-sentence)は、USE文である。(後述のデバッグおよび対話式デバッグの節と、言語リファレンス - 追加トピック報告書作成の節を参照。) USE文は、該当する節をいつ実行するかを指定する。

手続きは、手続き部内の段落または段落集団、あるいは節または節集団から成る。ある段落がある節内にある場合、すべてがその中になくてはならない。

この規則は強制しない。

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

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

しかし、宣言中の節は宣言完結文を必要としない。これはPERFORM文によって開始できる。(PERFORM文の詳細については、後述のPERFORM文の節を参照。)

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

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

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

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

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

10.1.1 手続き部の見出し

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

一般形式

書き方 1

書き方 2

指令

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

構文規則

「*」マークが付いた構文規則は、手続き部見出しとENTRY文で共通である。これらの規則で、「手続き部見出しまたはENTRY文」と記述されている箇所は、規則をどちらに適用するかによって、「手続き部見出し」または「ENTRY文」を該当させて読むこと。

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

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

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

  3. * USING句は、目的プログラムで、他のプログラムにより起動される呼ばれるプログラム、パラメータを渡す呼ぶプログラムの場合だけに必要である。呼ぶプログラムがCOBOLの場合、呼ばれるプログラムがUSING句を含むCALL文

    またはCHAIN文

    により起動される時に、パラメータが渡される。呼ぶプログラムがCOBOL以外の場合、パラメータが渡される方法については、その言語のマニュアルを参照のこと。

  4. * 手続き部見出し

    または ENTRY文

    のUSING句は、呼ばれるプログラムにより使用される名前を、呼ぶプログラムがそれに渡すパラメータ用に認識する。呼ぶプログラムがCOBOLの場合、呼ばれるプログラムに渡されるパラメータは、呼ぶプログラムのCALLのUSING句、

    またはCHAIN文

    で認識される。名前の2つのリスト間の相応は、位置ベースで確立され(CALL文参照)、

    呼ばれるプログラムの手続き部見出しまたは呼ぶプログラムのCALL文で指定された呼び名によって示されるものに委ねられる。

  5. * USING句の項目は、USAGE IS POINTERデータ項目またはADDRESS特殊レジスタの名前のどちらかであるCALL文のUSING句の項目を提供するUSAGE IS POINTERのデータ項目の名前にすることができる。

    USING句の項目は、USAGE IS PROCEDURE-POINTERデータ項目の名前であるCALL文のUSING句の項目を提供するUSAGE IS PROCEDURE-POINTERのデータ項目の名前にすることができる。

書き方 1
  1. * データ名-1は、呼ばれるプログラムのリンク節か、

    ファイル節か、作業領域節

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

    2回以上現れてもよい。

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

    REDEFINES句を含んでもよい。

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

  2. * データ名-2は、呼ばれるプログラムのリンク節か、ファイル節か、作業領域節で、レベル01またはレベル77項目として定義されなければならない。

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

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

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

一般規則

「*」マークが付いた一般規則は、手続き部見出しとENTRY文で共通である。これらの規則で、「手続き部見出しまたはENTRY文」と記述されている箇所は、規則をどちらに適用するかによって、「手続き部見出し」または「ENTRY文」を該当させて読むこと。

書き方

  1. * 手続き部見出しのUSING句およびCALL文のUSING句では、5つまでのデータ名が許される。

    手続き部見出しのUSING句、CALL文のUSING句、

    ENTRY文の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. * 呼ばれるプログラムの手続き部見出し

    またはENTRY文

    のUSING句中の作用対象の出現列、あるいは、呼ぶプログラムがCOBOLでない場合の呼ぶプログラムのCALL文

    またはCHAIN文またはパラメータリストの相応するUSING句中の作用対象の出現列は、

    呼ぶプログラムと呼ばれるプログラムにより使用されるデータ名間の相応を決定する。この相応は位置上のもので、名前が等しいことによるものではない。呼ばれるプログラムのUSING句の最初の作用対象は、呼ぶプログラムのUSING句またはパラメータリストの最初の作用対象に相応し、二番目は二番目と相応する。

    作用対象のいくつかが異なるため、相応が完了しない場合、残りの相応しない作用対象がCALL文中であれば無視され、手続き部見出しまたはENTRY文中であれば呼ばれるプログラム中では参照されてはならない。位置の相応は、呼び名により示されるCOBOL以外の呼出し規則に依存する。

    呼ばれるプログラムまたは呼ぶプログラムのUSING句に指定された作用対象の数が一致しないと、実行時に明らかになるだけで、FLAG指令はこの拡張をフラグ付けしない。

  5. * 手続き部見出し

    またはENTRY文

    のUSING句中の各データ項目は、呼ぶプログラムのCALL文

    またはCHAIN文

    中の相応するデータ項目が内容または参照によって渡されるパラメータを宣言している場合、BY REFERENCE句が呼ばれるプログラム中に宣言または示されていなければならない。

    呼ぶプログラムのCALL文中の相応するデータ項目が値によって渡されるパラメータを宣言している場合、BY VALUE句が呼ばれるプログラム中に宣言または示されていなければならない。

  6. * 呼ぶプログラムのCALL文

    またはCHAIN文

    中の相応するデータ項目への参照が内容によって渡されるパラメータを宣言している場合、項目の値は、CALL文が実行され、CALL文の一般規則に記述されている属性を持つCOBOLシステム定義の格納項目中に置かれた時に移動される。目的プログラムは、このCOBOLシステム定義の格納項目が参照によって渡されるかのように動作し、呼ばれるプログラムの相応するデータ項目と同じ格納領域を占めるかのように動作する。CALL文のBY CONTENT句中の各パラメータに相応する各COBOLシステム定義の格納項目データ宣言は、手続き部見出し

    またはENTRY文のUSING句中の相応するパラメータのデータ宣言と同じでなければならない(変換、拡張、丸めをしないで)。

  7. * 呼ぶプログラムのCALL文

    またはCHAIN文

    中の相応するデータ項目への参照が参照によって渡されるパラメータを宣言している場合、目的プログラムは呼ばれるプログラムのデータ項目が呼ぶプログラムのデータ項目と同じ格納領域を占めるかのように動作する。呼ばれるプログラムのデータ項目の宣言は、呼ぶプログラムの一致するデータ項目によって記述されるのと同じ数の文字位置を記述しなければならない。

  8. * 呼ぶプログラムのCALL文中の相応するデータ項目への参照が値によって渡されるパラメータを宣言している場合、項目の値は、CALL文が実行され、CALL文の一般規則に記述されている属性を持つシステム領域中に置かれた時に移動される。目的プログラムは、このシステム領域が参照によって渡されるかのように動作し、呼ばれるプログラムの相応するデータ項目と同じ格納領域を占めるかのように動作する。CALL文のBY VALUE句中の各パラメータに相応する各システム領域のデータ宣言は、手続き部見出しまたはENTRY文のUSING句中の相応するパラメータのデータ宣言と同じでなければならない(変換、拡張、丸めをしないで)。

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

    およびデータ名-2

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

  10. * 呼ばれるプログラムのリンク節で定義されたデータ項目は、以下の条件をいずれか一つ満たす場合に、そのプログラムの手続き部で参照される。

    1. それらが、手続き部見出し

      またはENTRY文のUSING句の作用対象である。

    2. それらが、手続き部見出し

      またはENTRY文のUSING句の作用対象に従属する。

    3. それらがREDEFINES句またはRENAMES句で定義され、上記の条件を満たすものである。

    4. それらが、上記のいずれかの条件を満たす項目に従属する。

    5. それらが、上記のいずれかの条件を満たすデータ項目に関連した条件名または索引名である。

    6. SET ADDRESS OF文が、そのデータ項目を受取り項目として実行された。

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

  12. USING指定を指定した場合、INITIAL句はどの通信記述にも指定してはならない。(言語リファレンス - 追加トピック通信の章の通信記述項 - 全体的な骨組みの節を参照。)

書き方 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.1.2 算術式

算術式(arithmetic expression)には、数字基本項目の一意名、数字定数、これらの一意名や定数を算術演算子でつないだもの、2つの算術式を算術演算子でつないだもの、算術式をかっこで囲んだものがある。算術式の前には単項演算子をつけることができる。算術式として許される変数、数字定数、算術演算子、かっこの組合わせを表10-1に示す。

  1. 以下の記述において、数字データ項目というときは、浮動小数点数データ項目も含まれる。

  2. 以下の記述において、数字定数というときは、浮動小数点数定数も含まれる。

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

    表 10-1: 算術式の中で使用できる要素

    最初の要素 2番目の要素
    変数 * / ** + - 単項 + - ( )
    変数 - P - - P
    * / ** + - P - P P -
    単項 + - P - - P -
    ( P - P P -
    ) - P - - P

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

10.1.2.1 算術演算子

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

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

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

10.1.2.2 書き方と評価規則

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

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

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

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

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

10.1.3 数字式

算術式は、COMPUTE文 、IF文、SEARCH文、部分参照の箇所等で使用する。

数字式は、実行時に一つの数値結果を得るために評価される。数字式の要素は、数字定数でも数字変数でもよい。

10.1.3.1 数字式の評価

この式は、一般的な評価順位で評価される。

 1 + 2 * 3 

は、まず

  • 2 * 3

    とし、次に

  • 1 + 6

    つまり、式の結果は7となる。

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

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

    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 を参照。各中間結果は、PICTURE 9(n)V9(m) を持つ。n+m の最大値は、選択されたオプションによって 30 または 31 である。

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

    10.1.4 条件式

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

    EVALUATE(評価)、

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

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

    10.1.4.1 単純条件

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

    10.1.4.2 比較条件

    比較条件(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: 比較演算子

    数字作用対象の比較

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

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

    文字作用対象の比較

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

    1. 文字作用対象が基本データ項目または文字定数であるならば、数字作用対象は、標準データ形式で同じ大きさの英数字基本データ項目に転記されたように扱われる。そして、この英数字データ項目の内容が、文字作用対象と比較される。(MOVE文の節、および使用する記号の項のPICTURE文字"P"の説明を参照。)

    2. 文字作用対象が集団項目であるならば、数字作用対象は、標準データ形式で同じ大きさの集団項目に転記されたように扱われる。そして、この集団項目の内容が文字作用対象と比較される。(MOVE文の節、および使用する記号の項のPICTURE文字"P"の説明を参照。)

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

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

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

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

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

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

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

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

    指標名および指標データ項目に関する比較

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

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

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

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

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

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

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

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

    一般形式

    構文規則

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

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

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

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

    一般規則

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

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

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

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

    一般形式

    構文規則

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

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

    一般規則

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

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

    10.1.4.2.3 字類条件

    機能

    字類条件(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.1.4.2.4 条件名条件(条件変数)

    機能

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

    一般形式

    構文規則

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

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

    一般規則

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

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

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

    10.1.4.2.5 スイッチ状態条件

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

    9つある

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

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

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

    一般形式

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

    COBOLスイッチがプログラムの中から設定されている場合にだけ、スイッチ状態条件を使用して検査することができる。

    10.1.4.2.6 正負条件

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

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

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

    10.1.4.3 複合条件

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

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

     

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

    10.1.4.3.1 否定単純条件

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

    一般形式

    10.1.4.3.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.1.4.4 略記組合せ比較条件

    単純比較条件または否定単純比較条件を、論理結合語で組み合わせていくつも続けて書く場合、先行する比較条件と共通の左辺または左辺と比較演算子があり、かつかっこを使用していなければ、最初のものを除く共通の比較条件を省略できる。下記の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.1.4.4.1 条件評価規則

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    10.1.5.1 ROUNDED指定

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

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

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

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

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

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

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

    10.1.5.2.1 ON SIZE ERROR 指定を指定していなかった場合

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

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

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

    10.1.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.1.5.2.3 NOT ON SIZE ERROR 指定

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

    10.1.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.1.5.4 算術文

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

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

    2. 各作用対象の 最大の大きさは 18桁である。また、 作用対象の合成も 18桁を超えてはならない。ここで、作用対象の合成とは、指定された各作用対象の小数点の位置を合わせて重ね合わせできる、仮想のデータ項目である。(後述のADD文, DIVIDE文,MULTIPLY文,SUBTRACT文の節を参照。)

    10.1.5.5 作用対象の重なり

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

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

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

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

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

    10.1.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.1.5.7 矛盾するデータ

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

    または関数定義

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

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

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

    10.1.5.8 符号付き受取り側項目

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

    10.1.6 ファイル入出力の概要

    10.1.6.1 ファイル位置指示子

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

    10.1.6.2 入出力状態

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

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

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

    10.1.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.1.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通りある。連続するキーの値が昇順になっていなかった。 (後述の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" (すべてのファイル)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進数で設定される。エラーメッセージについてはエラーメッセージを参照。

    10.1.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.1.6.3 ファイル終了条件

    READ文を実行した結果、ファイル終了条件が発生することがある。その原因の詳細については、後述のREAD文の節を参照。

    10.1.6.4 無効キー条件

    START文、READ文、WRITE文、REWRITE文、DELETE文を実行した結果、無効キー条件が発生することがある。その原因の詳細については、後述のSTART文,READ文, WRITE文, REWRITE文,DELETE文の各節を参照。

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

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

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

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

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

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

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

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

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

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

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

    10.1.6.5.1 排他モード

    排他モードにあるファイルは、1つの実行単位にだけ開かれている。他の実行単位はそのファイルにアクセスしようとすると、「ファイルロック」誤りを引き起こし、アクセスを拒否される。排他モードということは、1つの実行単位だけがファイルの鍵(ファイルロック)を保持していて、そのファイルにアクセスできるということである。実行単位においてそのファイルが閉じられると、そのファイルのロックが解除(release)される。

    10.1.6.5.2 共有モード

    共有モードにあるファイルは、任意の数の実行単位に開かれている。各実行単位は、ファイルを使用する間その中のレコードを一時に何件かロック(施錠)することによって、データを保護できる。他の実行単位は、ロック(施錠)されている個々のレコードの鍵(レコードロック)を取得できなくなる。しかし、その点を除けば、他の実行単位がファイルにアクセスできなくなるわけではない。ファイルの編成によって、ファイルを共有できる形態に違いが生じる。

    10.1.6.5.3 レコード順ファイル

    入力用に開かれたレコード順ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。入出力両用または拡張用に開かれたファイルもまた、いくつかの実行単位で共有することができる。この場合は、各実行単位はそのファイルに関してレコードロックをいくつか保持できる。出力用に開かれたファイルは、常に排他的にロックされている。

    10.1.6.5.4 行順ファイル

    入力用または拡張用に開かれた行順ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。出力用に開かれたファイルは、常に排他的にロックされている。

    10.1.6.5.5 相対ファイルおよび索引ファイル

    入力モードで開かれた行順ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。入出力両用モードで開かれたファイルも、共有できる。しかし、出力用または拡張用に開かれたファイルは、排他的である。

    10.1.6.5.6 レコードのロック

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

    10.1.6.5.7 単一レコードのロック

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

    10.1.6.5.8 マニュアルのレコードロック

    READ WITH LOCK文によってレコードを呼び出した場合にだけ、実行単位はレコードロックを取得できる。

    10.1.6.5.9 自動のレコードロック

    ファイル中のレコードを読むときに、実行単位はレコードロックを自動的に取得する。ただし、READ WITH NO LOCK文を使用した場合は、例外である。

    10.1.6.5.10 単一レコードのロック解除

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

    10.1.6.5.11 複数レコードのロック

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

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

    10.1.6.5.12 マニュアルのレコードロック

    READ WITH LOCK文 またはREAD WITH KEPT LOCK文によってレコードを呼び出した場合にだけ、実行単位はレコードロックを取得できる。

    10.1.6.5.13 自動のレコードロック

    ファイル中のレコードを読むときに、実行単位はレコードロックを自動的に取得する。ただし、ロックしないことを明示的に指定した場合は、例外である。プログラムをCOBOLシステムに投入したときにWRITELOCK指令を設定しておくと、WRITE文またはREWRITE文によって実行単位がファイルにアクセスすると、ロックされる。

    10.1.6.5.14 複数レコードのロック解除

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


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


    Copyright © 2002 Micro Focus International Limited. All rights reserved.
    本書、ならびに使用されている固有の商標と商品名 は国際法によって保護されています。
    前ページへ データ部 - 画面節 手続き部 - 組み込み関数 次ページへ