![]() |
データ部 - 画面節 | 手続き部 - 組み込み関数 |
手続き部(procedure division)は、COBOL 原始プログラム中に任意で記述する。プログラム定義では、オブジェクトプログラム内で実行する手続きを含む。これらの手続きは、宣言しても、宣言しなくてもよい。呼出しプロトタイプでは、宣言した、または宣言しない手続きをどちらも含まない。ただし、ENTRY文は含んでも構わない。
宣言節は、手続き部の最初で集団にしなければならない。これを以下の一般形式の書き方 1に示す。
PROCEDURE DIVISION.
[ DECLARATIVES.
{ 節名 SECTION.
宣言完結文.
[ 完結文 ]
[ 段落名. [ 完結文 ]
]
}
END DECLARATIVES. ]
[ { メソッド定義 }
] 「手続き部の見出し」については、次の 手続き部の見出しの節で説明する。
上記の 宣言完結文(declarative-sentence)は、USE文である。(後述のデバッグおよび対話式デバッグの節と、言語リファレンス - 追加トピックの報告書作成の節を参照。) USE文は、該当する節をいつ実行するかを指定する。
手続きは、手続き部内の段落または段落集団、あるいは節または節集団から成る。ある段落がある節内にある場合、すべてがその中になくてはならない。
この規則は強制しない。
段落は、段落名の後に続けて終止符(.)と空白を書き、後ろに完結文をいくつか書いたものである。段落の終了は、次の段落名または節名の直前、あるいは、手続き部の終わり、宣言部分のEND DECLARATIVESのところまでとなる。
節は、節見出しと、その後に続くいくつかの段落から成る。節の終了は、次の節名、あるいは手続き部の終わり、宣言部分のEND DECLARATIVESのところまでとなる。
しかし、宣言中の節は宣言完結文を必要としない。これはPERFORM文によって開始できる。(PERFORM文の詳細については、後述のPERFORM文の節を参照。)
完結文(sentence)は、上記で説明した名前付きの段落内に明示的には含まれない。名前のない暗黙的な段落内に含まれているとみなされる。段落は、節内に明示的には含まれない。名前のない暗黙的な節内に含まれているとみなされる。
プログラムの定義では、実行は、手続き部の宣言部分ではない最初の文から始まる。以降、文は記述されている順序に実行される。ただし、他の順序が示されている場合は例外である。
呼出しプロトタイプでは、手続き部は実行されない。
ここでは、算術式と条件式、共通指定と入出力指定、組み込み関数、COBOL動詞について説明する。
手続き部の見出しは、手続き部の書き方2では書いても書かなくてもよい。ただしこれは、、これより前に部が記述されていない場合、および手続き部がCOBOLの文で始まる場合(節見出し、段落見出し、宣言節ではなく)にだけ、任意となる。
手続き部の冒頭には、下記の見出しを付けなければならない。
「*」マークが付いた構文規則は、手続き部見出しとENTRY文で共通である。これらの規則で、「手続き部見出しまたはENTRY文」と記述されている箇所は、規則をどちらに適用するかによって、「手続き部見出し」または「ENTRY文」を該当させて読むこと。
呼び名は、特殊名段落で定義しなければならない。この方法、および実行時環境でサポートされる呼出し規則とのインターフェイスをCOBOLシステムで記述する方法についての詳細は、特殊名段落の節を参照。
またはCHAIN文
により起動される時に、パラメータが渡される。呼ぶプログラムがCOBOL以外の場合、パラメータが渡される方法については、その言語のマニュアルを参照のこと。
または ENTRY文
のUSING句は、呼ばれるプログラムにより使用される名前を、呼ぶプログラムがそれに渡すパラメータ用に認識する。呼ぶプログラムがCOBOLの場合、呼ばれるプログラムに渡されるパラメータは、呼ぶプログラムのCALLのUSING句、
またはCHAIN文
で認識される。名前の2つのリスト間の相応は、位置ベースで確立され(CALL文参照)、
呼ばれるプログラムの手続き部見出しまたは呼ぶプログラムのCALL文で指定された呼び名によって示されるものに委ねられる。
USING句の項目は、USAGE IS PROCEDURE-POINTERデータ項目の名前であるCALL文のUSING句の項目を提供するUSAGE IS PROCEDURE-POINTERのデータ項目の名前にすることができる。
ファイル節か、作業領域節
で、レベル01またはレベル77項目として定義されなければならない。特定のユーザ定義の語は、データ名-1として 2回以上現れてはならない。
2回以上現れてもよい。
データ名-1の記述項目は、REDEFINES句を含んではならない。
REDEFINES句を含んでもよい。
しかし、データ名-1はリンク節のどこにおいても REDEFINES句の対象にできる。
「*」マークが付いた一般規則は、手続き部見出しとENTRY文で共通である。これらの規則で、「手続き部見出しまたはENTRY文」と記述されている箇所は、規則をどちらに適用するかによって、「手続き部見出し」または「ENTRY文」を該当させて読むこと。
手続き部見出しのUSING句、CALL文のUSING句、
ENTRY文のUSING句では、62までのデータ名が許される。
またはENTRY文
のUSING句中の作用対象の出現列、あるいは、呼ぶプログラムがCOBOLでない場合の呼ぶプログラムのCALL文
またはCHAIN文またはパラメータリストの相応するUSING句中の作用対象の出現列は、
呼ぶプログラムと呼ばれるプログラムにより使用されるデータ名間の相応を決定する。この相応は位置上のもので、名前が等しいことによるものではない。呼ばれるプログラムのUSING句の最初の作用対象は、呼ぶプログラムのUSING句またはパラメータリストの最初の作用対象に相応し、二番目は二番目と相応する。
作用対象のいくつかが異なるため、相応が完了しない場合、残りの相応しない作用対象がCALL文中であれば無視され、手続き部見出しまたはENTRY文中であれば呼ばれるプログラム中では参照されてはならない。位置の相応は、呼び名により示されるCOBOL以外の呼出し規則に依存する。
呼ばれるプログラムまたは呼ぶプログラムのUSING句に指定された作用対象の数が一致しないと、実行時に明らかになるだけで、FLAG指令はこの拡張をフラグ付けしない。
またはENTRY文
のUSING句中の各データ項目は、呼ぶプログラムのCALL文
またはCHAIN文
中の相応するデータ項目が内容または参照によって渡されるパラメータを宣言している場合、BY REFERENCE句が呼ばれるプログラム中に宣言または示されていなければならない。
呼ぶプログラムのCALL文中の相応するデータ項目が値によって渡されるパラメータを宣言している場合、BY VALUE句が呼ばれるプログラム中に宣言または示されていなければならない。
またはCHAIN文
中の相応するデータ項目への参照が内容によって渡されるパラメータを宣言している場合、項目の値は、CALL文が実行され、CALL文の一般規則に記述されている属性を持つCOBOLシステム定義の格納項目中に置かれた時に移動される。目的プログラムは、このCOBOLシステム定義の格納項目が参照によって渡されるかのように動作し、呼ばれるプログラムの相応するデータ項目と同じ格納領域を占めるかのように動作する。CALL文のBY CONTENT句中の各パラメータに相応する各COBOLシステム定義の格納項目データ宣言は、手続き部見出し
またはENTRY文のUSING句中の相応するパラメータのデータ宣言と同じでなければならない(変換、拡張、丸めをしないで)。
またはCHAIN文
中の相応するデータ項目への参照が参照によって渡されるパラメータを宣言している場合、目的プログラムは呼ばれるプログラムのデータ項目が呼ぶプログラムのデータ項目と同じ格納領域を占めるかのように動作する。呼ばれるプログラムのデータ項目の宣言は、呼ぶプログラムの一致するデータ項目によって記述されるのと同じ数の文字位置を記述しなければならない。
およびデータ名-2
への参照は、呼ばれるプログラムのリンク節で与えられた項目の記述に従って決定される。この記述が呼ぶプログラムの相応するデータ項目よりも多くの文字位置を定義している場合、予期せぬ結果となる。この規則の適用に失敗したり、特定のランタイム環境用のシステム領域で許される最大サイズを超えると、システムはたいへんな損害を被ることになる。
またはENTRY文のUSING句の作用対象である。
またはENTRY文のUSING句の作用対象に従属する。
算術式(arithmetic expression)には、数字基本項目の一意名、数字定数、これらの一意名や定数を算術演算子でつないだもの、2つの算術式を算術演算子でつないだもの、算術式をかっこで囲んだものがある。算術式の前には単項演算子をつけることができる。算術式として許される変数、数字定数、算術演算子、かっこの組合わせを表10-1に示す。
算術式の中に現れる一意名および定数は、算術演算を行える数字基本項目または数字定数のどちらかを表わしていなければならない。
表 10-1: 算術式の中で使用できる要素
| 最初の要素 | 2番目の要素 | ||||
|---|---|---|---|---|---|
| 変数 | * / ** + - | 単項 + - | ( | ) | |
| 変数 | - | P | - | - | P |
| * / ** + - | P | - | P | P | - |
| 単項 + - | P | - | - | P | - |
| ( | P | - | P | P | - |
| ) | - | P | - | - | P |
| P | 許される要素の組合わせを示す |
| - | 無効な組合わせを示す |
| 変数 | 一意名または定数を示す |
算術式に使用できる演算子(arithmetic operator)には、5つの2項演算子(binary arithmetic operator)と、2つの単項演算子(unary arithmetic operator)がある。これらの演算子は特定の記号で表わし、前後を空白で区切る。
| 2項演算子 |
意味 |
|---|---|
| + | 加算 |
| - | 減算 |
| * | 乗算 |
| / | 除算 |
| ** | べき乗 |
| 単項演算子 |
意味 |
|---|---|
| + | 数字定数+1を掛けることと同じ |
| - | 数字定数-1を掛けることと同じ |
| 1番目 | 単項演算子の+と- |
| 2番目 | 指数 |
| 3番目 | 乗算と除算 |
| 4番目 | 加算と減算 |
算術式は、COMPUTE文 、IF文、SEARCH文、部分参照の箇所等で使用する。
数字式は、実行時に一つの数値結果を得るために評価される。数字式の要素は、数字定数でも数字変数でもよい。
この式は、一般的な評価順位で評価される。
1 + 2 * 3
は、まず
とし、次に
つまり、式の結果は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オプションを記述した場合、このシステムは以下の制限で、選択されたメインフレームの動作をその結果を適当に切捨てて想定する。
条件式(conditional expression)は、 実行用プログラムの流れを制御する条件を表わす。条件を評価した結果の真理値に応じて、プログラムの処理の経路が選択される。条件式は、
EVALUATE(評価)、
IF(判断)、PERFORM(実行)、SEARCH(表引き)の各文の中に指定する。条件式は単純条件と複合条件に分類される。どちらの種類の条件も、任意の数のかっこで囲むことができる。 かっこで囲んでも、条件の種類は変わらない。
OSVSシステム指令を設定した場合、
条件式の中で部分参照を行うことはできない。
単純条件(simple condition)には、比較条件、字類条件、条件名条件、スイッチ状態条件、符号条件がある。単純条件は真理値として、「真」または「偽」のどちらかをとる。単純条件をかっこで囲んでも、真理値は変わらない。
比較条件(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 |
字類が数字の作用対象に関しては、その代数値が比較される。定数または算術式を表わす数字の数は意味をもたない。ゼロは符号が付いていても付いていなくても、1つの値とみなされる。
これらの作用対象は、その用途がどのように記述されているかにかかわらず、比較することが許される。符号の付いていない数字作用対象は、比較上は、正の数として扱われる。
文字作用対象どうしの比較、または1つの数字作用対象と1つの文字作用対象の比較は、 指定されている文字の照合順序に基づいて行われる。 (前述の実行用計算機段落の節を参照。) 一方の作用対象が数字である場合、整数データ項目または整数定数にする。そして、下記のことに注意する。
作用対象の大きさは、作用対象中の標準データ形式文字の合計数である。
表意定数を持つ数字編集データ項目を比較することができる。これは英数字比較として扱われる。
用途が違っていても、数字作用対象と文字作用対象を比較できる。数字作用対象は、標準データ形式で同じ大きさのUSAGE DIAPLAY項目に転記されたように扱われる。そして、この内容が文字作用対象と比較される。
比較処理は2つの場合に分けられる。
不一致であった最初の対応する文字は、文字の照合順序を比較される。そして、照合順序の大きい方の文字を含む作用対象の方が大きい作用対象であるとみなされる。
下記の項目の間でだけ、比較できる。
用途が明示的にまたは暗黙的に、ポインタとされている2つのデータ項目を比較できる。ポインタの比較では、等しいか等しくないかだけを検査する比較演算子だけを使用できる。
用途が手続きポインタである、2つのデータ項目を比較できる。
字類条件(class condition)は、作用対象が数字であるか英字であるか、
あるいは、小文字の英字であるか、大文字の英字であるか、環境部の特殊名段落中にCLASS句によって指定されている文字集合に属する文字だけが含まれるかを、判定する。
小文字のa, b, c, ...z、
または大文字
と小文字
および空白の任意の組合わせから構成される場合、作用対象は英字である。
COMPUTATIONAL,
COMPUTATIONAL-X,
COMPUTATIONAL-3 ,
COMPUTATIONAL-5,
PACKED-DECIMAL
NOTを指定した場合、NOTとこれに続く語は、真理値を導くための字類検査を定義する 1つの字類条件となる。例えば NOT NUMERICは、作用対象が文字であるかを判断する真偽検査である。字類条件が語NOTを含んでいて、一意名-1が長さゼロの集団項目である場合、字類検査の結果は常に真となる。
長さゼロの集団項目である場合の字類検査の真理値は、ZEROLENGTHFALSE 指令によって予約されている。
NUMERIC検査を、データ記述項に演算子が記述されている基本項目から成る集団項目に対して使用できる。
および小文字の英字"a"から"z"
と空白の任意の組合わせで構成されているときだけである。
外部浮動小数点数項目(USAGE DISPLAY)および内部浮動小数点数項目(USAGE COMP-1およびUSAGE COMP-2)には、字類条件を使用できない。
条件名条件(condition-name condition)は、条件変数(condition variable)の値が条件名に対応する値のどれかと等しいか否かを判定する。
スイッチ状態条件(switch-status condition)は、
9つある
COBOLスイッチのそれぞれが「オン」の状態にあるか「オフ」の状態にあるかを判定する。
スイッチには、順にSWITCH-0からSWITCH-8という名前が付けられている。
それらの各スイッチの値(「オン」と「オフ」)は、COBOL実行用プログラムの実行を開始するときに、操作員によって設定される。(ランタイムスイッチの詳細については、 COBOLシステムのマニュアルを参照。) 条件名に対応するスイッチと「オン」または「オフ」状態は、環境部の特殊名段落の中で定義しておく。
条件名に定義されている状態にスイッチが設定されていると、検査の結果は真となる。
COBOLスイッチがプログラムの中から設定されている場合にだけ、スイッチ状態条件を使用して検査することができる。
正負条件(sign condition)は、算術式の値が正か負かゼロかを判定する。 一般形式
正負条件の必要語に "NOT" を付けたものは、1つの正負条件である。この条件に照らして代数検査が行われ、真理値が求められる。たとえば、 "NOT ZERO" は作用対象の値がゼロでない( 正または 負) のときに真となる。作用対象は、値がゼロよりも大きいときに正であり、値がゼロよりも小さいときに負であり、値がゼロのときゼロである。算術式は、少なくとも1つの変数を参照しなければならない。
符号検査において、ZEROの代わりにZEROSまたはZEROESを使用できる。
複合条件は、論理的結合子(論理演算子、"AND" および "OR")による単純条件、組み合わせ条件、および複合条件の結合、または、これらの条件の論理否定(論理演算子、"NOT")による否定で形成される。複合条件の真の値は、かっこに囲まれているかどうかにかかわらず、単純条件の個々の真の値に関する、記述されたすべての論理演算子の連携、または、論理的に結合または否定された条件の中間の真の値の結果である真の値である。
論理演算子およびその意味は以下のとおりである。
| 演算子
|
意味
|
|---|---|
| AND | 論理的な結合。真の値は、結合されている条件が真であれば、"真"。結合されている条件の片方または両方が偽であれば、 "偽"。 |
| OR | 論理的な包含。真の値は、包含されている条件の片方または両方が真であれば、、"真"。包含されている条件の両方が偽であれば、 "偽"。 |
| NOT | 論理的な否定、または真の値の逆。 真の値は、条件が偽であれば、"真"。条件が真であれば、 "偽"。 |
否定単純条件(negated simple condition)は、単純条件に 論理演算子の"NOT" を付けたものである。否定単純条件は、単純条件の真理値を逆転させる働きをする。したがって、単純条件の真理値が「偽」のときに否定単純条件の真理値は「真」となり、単純条件の真理値が「真」のときに否定単純条件の真理値は「偽」となる。否定単純条件は、単純条件の真理値を逆転させる働きをする。したがって、単純条件の真理値が「偽」のときに否定単純条件の真理値は「真」となり、単純条件の真理値が「真」のときに否定単純条件の真理値は「偽」となる。否定単純条件を かっこで囲んでも真理値は変わらない。
組合せ条件(combined condition)は、論理演算子の"AND" または "OR" で条件をつないだものである。
条件と条件演算子を結び付け、かっこで囲む有効な組合せを、表 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" は許されない)。
単純比較条件または否定単純比較条件を、論理結合語で組み合わせていくつも続けて書く場合、先行する比較条件と共通の左辺または左辺と比較演算子があり、かつかっこを使用していなければ、最初のものを除く共通の比較条件を省略できる。下記の2通りの方法がある。
一続きの比較条件の中で、上記の両方の形の省略方法を使用できる。略記した場合、先行する明記した最後の左辺が省略した左辺を補うように挿入され、先行する明記した最後の比較演算子が省略した比較演算子を補うように挿入される。 このように暗黙的に左辺および比較演算子が挿入された結果は、表 10-3の規則に合わなければならない。省略した左辺や比較演算子が補われるこの処理は、組合せ条件の中に略記しない単純条件が出てくると終了する。
条件が評価される順序を、かっこを使用することによって変更できる。(下記の例を参照)
略記組合せ比較条件の中で"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 (x > y AND x > z) |
|
|
(x > a OR x > y) AND x > z |
|
|
x = a OR x > b |
|
|
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) |
暗黙的な評価順序を変更する必要があるときは、かっこを使用して、組合せ条件の個々の条件が評価される順序を指定できる。
かっこ内の条件が先に評価される。かっこが入れ子になっている場合は、最も内側のかっこから順次外側へと評価が進められる。かっこが使用されていないかまたはかっこ内の条件が同じレベルにあるときは、下記の暗黙的な階層順序に従って論理評価が進められ、最終的な真理値が決定される。
比較(略記比較条件があれば、通常の形に展開してから)
字類
条件名
スイッチ状態
正負
以降に説明する各文において、次のような指定が頻繁に出てくる。ROUNDED(四捨五入)指定、ON SIZE ERROR(桁あふれ)指定、
NOT ON SIZE ERROR(桁あふれなし)指定、
CORRESPONDING(対応)指定などである。以下に、これらを個々に説明する。
以降の説明の中で、 「結果の一意名」という用語を使用する。これは算術演算の結果を入れる一意名を表わす。
小数点の位置をそろえたとき、算術演算の結果の 小数部の桁数が結果の一意名の小数部の桁数よりも大きいと、結果の一意名の大きさに応じて 切捨てが発生する。 四捨五入が要求されると、あふれる桁の最上位の値が5以上であると、結果の一意名の最下位の桁の絶対値に1が加えられる。
結果の一意名の整数部分の下位が PICTURE文字の "P" を用いて表わされているときには、 四捨五入や 切捨ては、実際に記憶場所を割り当てられている部分の右端の整数部に対して行われる。
浮動小数点数の算術演算においては、
ROUNDED指定は注記として扱われる。浮動小数点数の演算結果は、つねに四捨五入される。
小数点の位置をそろえたとき、算術演算の結果の絶対値が対応する結果の一意名がとる最大値を超えると、桁あふれ条件が発生する。 除数がゼロである除算が行われると、つねに桁あふれ条件が発生する。ON SIZE ERROR指定を指定しなかったときの ゼロによる除算の結果はどうなるかわからないので、注意する必要がある。一般に、 桁あふれ条件は最終結果に対してだけ適用される。ただし、MULTIPLY(乗算)文およびDIVIDE(除算)文の場合は、 中間結果に対しても桁あふれ条件が適用される。
指数の評価規則から外れると、つねに、算術演算は停止され、桁あふれ条件が発生する。
ROUNDED指定を書くと、四捨五入の後で桁あふれの検査が行われる。その結果桁あふれ条件が発生すると、ON SIZE ERROR指定を指定してあったか否かによって、下記のように処理が分かれる。
桁あふれ条件が発生すると、対応する結果の一意名の値はどうなるかわからない。この演算処理が実行される間に、桁あふれ条件が発生しなかった結果の一意名の値が、他の結果の一意名に対して発生した桁あふれ条件の影響を受けることはない。
算術演算が終了すると、制御は算術文の末尾に移される。NOT ON SIZE ERROR指定は指定されていても無視される。
除数がゼロの除算の結果は、 ON SIZE ERRORを指定していないと、どうなるかわからない。それを避けるためには、CHECKDIVコンパイラ指令と O ランタイムスイッチを使用するとよい。
桁あふれ条件が発生すると、桁あふれの影響を受ける結果の一意名の値は変更されない。桁あふれ条件の発生しなかった結果の一意名の値が、この演算処理が実行される間に他の結果の一意名に対して発生した桁あふれ条件の影響を受けることはない。 この演算処理が終了すると、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指定の両方を指定したときに、実行された方の指定の中に制御を明示的に移す文が含まれていないと、必要があればその指定の実行が終わった時点で、その算術文の末尾に制御が暗黙的に移される。
算術演算文を実行したときに桁あふれ条件が発生しなかった場合にNOT ON SIZE ERROR指定が指定されていれば、その中に記述されている無条件命令が実行される。この場合、ON SIZE ERROR指定が指定されていても無視され、その中に記述されている無条件命令は実行されない。
以下の説明で、d1とd2という記号を使用する。このd1とd2はそれぞれ別々の集団項目を指す一意名を表わす。d1とd2から1つずつ取った一組のデータ項目は、下記の条件が満たされるとき対応するという。
78,
88, USAGE IS INDEX句, >,
USAGE IS OBJECT
句が含まれていない。
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も、部分参照できない。
算術文には、ADD, COMPUTE, DIVIDE, MULTIPLY, SUBTRACTがある。これらの文には、下記の共通の特徴がある。
ある文の送出し側項目と受取り側項目とが記憶領域の一部を共有するとき
同じデータ記述項目によってまだ定義されていない場合、
その文を実行した結果はどうなるかわからない。
重なりの転記は、MOVE文が使用され、作用対象が部分参照も添え字も使用していない場合にだけ、翻訳時に検出される。コンパイラ指令
WARNING"3"を設定してある場合、前方への重なりの転記があると警告メッセージが出される。 コンパイラ指令
FLAG"方言"を設定してある場合、その他のタイプであればフラグメッセージが出される。ただし、
OSVS以外の"方言"とする。同じ記憶域を共有する項目を送受信する他の操作は、検出されない。
COBOL原始コードの移植性は、原始プログラム内でMOVE文の重なりが起きない時にだけ保証されるが、このCOBOLシステムはこのような文を認めていない。このような文の動作は、BYTE-MODE-MOVE指令の指定により変わる。
ADD, COMPUTE, DIVIDE, MULTIPLY, SUBTRACTの各文は複数個の答をもつことがある。これらの文は、下記のように書かれたものとして実行される。
例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)
字類条件 (前述の字類条件の節を参照) の中で参照された場合は除いて、手続き部で参照されたデータ項目の内容が、そのデータ項目のPICTURE句
または関数定義
に指定されている字類と合わないと、そのデータ項目を参照した結果はどうなるかわからない。
数字項目を参照したところ、その項目に文字または無効なデータが含まれていた場合、結果はどうなるかわからない。このような条件は、実行時に検出されてエラーとされる。この動作は、F ランタイムスイッチの影響を受ける。
英字項目を参照したところ、その項目に英字でないデータが含まれていた場合、プログラムの実行は続けられるが、結果はどうなるかわからない。
算術文またはMOVE文中の受取り側項目が、符号付きの数字または数字編集項目である場合、受取り側項目に符号が転記される。この符号の転記は、数字データの絶対値が切り捨てられたか否かに関係なく行われる。したがって、数値はゼロであるが、符号が負ということが起こり得る。
ファイル位置指示子(file position indicator)は、ファイルに一連の入出力操作を施している際に、次に呼び出されるレコードを指す働きをする。ファイル位置指示子の設定に影響する文は、CLOSE, OPEN, START, READだけである。出力モードまたは拡張モードで開かれたファイルに対しては、ファイル位置指示子は影響を及ぼさない。
ファイル管理記述項にFILE STATUS STATUS句を指定すると、ファイル入出力操作の結果を示す2文字のデータ項目がとられる。OPEN, CLOSE, READ, WRITE, DELETE, UNLOCK, STARTの各文を実行すると、その結果を示す値がこのデータ項目に設定される。実行する条件に該当するUSE手続きがある場合、それが実行される前にこの値が設定される。
以下に記述するファイル状態キーは、ANSI標準に全面的に準拠したものであるとともに、このCOBOLシステムで使用できる拡張機能を、何も使用していないファイルに関するものである。
たとえば、拡張機能を使用してファイルをLINE SEQUENTIALと指定すると、返される状態キーに影響が出る。詳しいことは関連する動詞の箇所に説明してある。
FILE STATUSデータ項目の左端の文字を、状態キー1という。どのような編成のものでも、ファイルの入出力操作が終了すると、このデータ項目に下記の条件のどれかを示す値が設定される。
| "0" | - 正常終了(successful completion) |
| "1" | - ファイル終了(at end) |
| "2" | - 無効キー(invalid key) |
| "3" | - 永続誤り(permanent error) |
|
|
- 論理誤り(logic error) |
| "9" | - ランタイム・システム・エラーメッセージ(run-time system error message) |
上記の各条件の意味は下記のとおり。
FILE STATUSデータ項目の右端の文字を、状態キー2という。状態キー2は入出力操作の結果の、さらに詳細を示すために使用される。
状態キー1と状態キー2の組合せによって、入出力操作の結果が下記のように細かく定義される。
状態キー1の値が"0" で、 入出力操作が正常に終了したことが示されている場合、 状態キー2にはその原因を示す下記のどれかの値が設定される。
| "0" | すべてのファイル)それ以上詳しい情報はない。 |
| "2" | 索引ファイルだけ)下記の2通りの可能性を示す。
|
| "4" |
|
| "5" |
|
| "7" |
|
ファイル終了条件による不成功
状態キー1の値が"1" で、 ファイル終了条件(at end condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。
| "0" | すべてのファイル)次の論理レコードが存在しないことを示す。この条件が発生する場合は下記の2通りある。
|
| "4" |
|
状態キー1の値が "2" で、無効キー条件(invalid key condition)が発生したことが示されている場合、 状態キー2にはその原因を示す下記のどれかの値が設定される。
永続誤り条件による不成功
状態キー1の値が"3" で、 永続誤り条件(permanent error condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。
論理誤り条件による不成功
状態キー1の値が "4" で、 論理誤り条件(logic error condition)が発生したことが示されている場合、 状態キー2にはその原因を示す下記のどれかの値が設定される。
状態キー1の値が" 9" で、作成者が定義したエラーメッセージが発生したことが示されている場合、 状態キー2には該当するエラーメッセージ番号が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) | |||||||||
READ文を実行した結果、ファイル終了条件が発生することがある。その原因の詳細については、後述のREAD文の節を参照。
START文、READ文、WRITE文、REWRITE文、DELETE文を実行した結果、無効キー条件が発生することがある。その原因の詳細については、後述のSTART文,READ文, WRITE文, REWRITE文,DELETE文の各節を参照。
入出力文に指定された入出力操作が実行された後で無効キー条件が発生すると、下記の動作が記してある順に行われる。
無効キー条件が発生すると、そのことを認識する入出力文は不成功となる。この場合、ファイルは影響を受けない。
状態キー1に"9" が設定されたときは、INVALID KEY指定によって誤りが捕らえられるのではないことに注意。この場合は、明示的に状態キーを検査するか 宣言部分を使用するかして、別途誤りを捕られなければならない。
ランタイムシステム(RTS)では、このCOBOLシステムのマルチユーザー機能をサポートしている。このマルチユーザー機能によって、マルチユーザー環境下で利用者がファイルを共有すること、あるプログラムがデータを更新する間は他のプログラムが該当するファイル全体またはそのレコードをアクセスできないようにすることが可能になる。
シングルユーザー環境下では、マルチユーザー用の構文は実行時に効力を発揮しない。しかし、シングルユーザーとマルチユーザーの両方の環境で使用できるように、プログラムを作成しておくことができる。
ファイルはアクティブか非アクティブのどちらかの状態をとる。アクティブ・ファイルとはいくつかの実行単位に対して開かれているものである。非アクティブ・ファイルとはどの実行単位に対しても開かれていないものである。
アクティブ・ファイルには、排他モード(exclusive mode)と共有モード(sharable mode)の2つのモードがある。
排他モードにあるファイルは、1つの実行単位にだけ開かれている。他の実行単位はそのファイルにアクセスしようとすると、「ファイルロック」誤りを引き起こし、アクセスを拒否される。排他モードということは、1つの実行単位だけがファイルの鍵(ファイルロック)を保持していて、そのファイルにアクセスできるということである。実行単位においてそのファイルが閉じられると、そのファイルのロックが解除(release)される。
共有モードにあるファイルは、任意の数の実行単位に開かれている。各実行単位は、ファイルを使用する間その中のレコードを一時に何件かロック(施錠)することによって、データを保護できる。他の実行単位は、ロック(施錠)されている個々のレコードの鍵(レコードロック)を取得できなくなる。しかし、その点を除けば、他の実行単位がファイルにアクセスできなくなるわけではない。ファイルの編成によって、ファイルを共有できる形態に違いが生じる。
入力用に開かれたレコード順ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。入出力両用または拡張用に開かれたファイルもまた、いくつかの実行単位で共有することができる。この場合は、各実行単位はそのファイルに関してレコードロックをいくつか保持できる。出力用に開かれたファイルは、常に排他的にロックされている。
入力用または拡張用に開かれた行順ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。出力用に開かれたファイルは、常に排他的にロックされている。
入力モードで開かれた行順ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。入出力両用モードで開かれたファイルも、共有できる。しかし、出力用または拡張用に開かれたファイルは、排他的である。
ファイルへのアクセスを共有する各実行単位は、そのファイル中の単一のレコードまたは複数のレコードをロックすることができる。ただし、1つの実行単位が同じファイルに対して、単一レコードのロックと複数レコードのロックの両方を選択することはできない。
あるファイルに対して(明示的にまたは暗黙的に)単一レコードのロックを指定した実行単位は、一時点ではそのファイル中の1レコードだけをロックできる。実行単位がレコードロックを獲得する方法には、マニュアルと自動の2通りがある。
READ WITH LOCK文によってレコードを呼び出した場合にだけ、実行単位はレコードロックを取得できる。
ファイル中のレコードを読むときに、実行単位はレコードロックを自動的に取得する。ただし、READ WITH NO LOCK文を使用した場合は、例外である。
ロック解除はロックした実行単位によって、下記のどれかの方法によって行われる。
ファイル編成が相対か索引かレコード順の場合にだけ、複数レコードをロックできる。
複数レコードをロックすることを指定した実行単位は、1つのファイル中で同時に何件ものレコードロックを保持できる。他の実行単位は、ロックされているレコードを更新したりロックしたりすることができなくなる。しかし、他の実行単位がロックされていないレコードへのアクセスを拒否されるわけではない。実行単位がレコードロックを獲得する方法には、マニュアルと自動の2通りがある。
READ WITH LOCK文 またはREAD WITH KEPT LOCK文によってレコードを呼び出した場合にだけ、実行単位はレコードロックを取得できる。
ファイル中のレコードを読むときに、実行単位はレコードロックを自動的に取得する。ただし、ロックしないことを明示的に指定した場合は、例外である。プログラムをCOBOLシステムに投入したときにWRITELOCK指令を設定しておくと、WRITE文またはREWRITE文によって実行単位がファイルにアクセスすると、ロックされる。
ロック解除はロックした実行単位によって、下記のどれかの方法によって行われる。
表 10-5, 10-6, 10-7 に、ファイル編成別に
ファイルをオープンするモードごとの省略時解釈のロック型を示す。 この省略時解釈のロック型は、
プログラムをCOBOLに投入するときに
AUTOLOCK指令を設定することによって、
変更できる 。また、表には、個々のファイルごとに、省略時解釈のロック型を変更することができるか否かについても示す。ファイルごとにロック型を変更するには、そのファイルのSELECT句中に適切な句を挿入する 。(構文の詳細については、後述のSELECT文の節を参照。)
X/Open では、自動ロックでの単一レコードロック、またはマニュアルロックでの複数レコードロックのどちらかを使用する原始プログラムに従う X/Open を制限している。
表 10-5: レコード順ファイルの省略時解釈のロック型
| 開くモード | 指令なし | AUTOLOCK指令 |
SELECT文での変更 |
| INPUT | ロックなし | ロックなし | 可、ただし排他へだけ |
| I/O | 排他 | 単一レコードのロック | 可 |
| OUTPUT | 排他 | 排他 | 不可 |
| EXTEND | 排他 | ロックなし | 可、ファイルを共有可できるがレコードはロックできない |
| 開くモード | 指令なし | AUTOLOCK指令 |
SELECT文での変更 |
| INPUT | ロックなし | ロックなし | 不可 |
| I/O | 排他 | ロックなし | 不可 |
| OUTPUT | 排他 | 排他 | 不可 |
| EXTEND | 排他 | ロックなし | 不可 |
表 10-7: 相対ファイルおよび索引ファイルの省略時解釈のロック型
| 開くモード | 指令なし | AUTOLOCK指令 |
SELECT文での変更 |
| INPUT | ロックなし | ロックなし | 可、ただし排他へだけ |
| I/O | 排他 | 単一レコードの自動ロック | 可 |
| OUTPUT | 排他 | 排他 | 不可 |
| EXTEND | 排他 | 排他 | 不可 |
注:
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名 は国際法によって保護されています。
![]() |
データ部 - 画面節 | 手続き部 - 組み込み関数 | ![]() |