パラメーターは、メソッドに渡される値参照または変数参照です。これらはメソッドのヘッダーまたは手続き部の見出しで指定できます。メソッドのヘッダーで指定されている場合は、そのメソッドから手続き部の見出しを省略する必要があります。
パラメーターの実際の値は、メソッドの呼び出し時に指定されます。
通常、メソッドを呼び出す際には、呼び出しでパラメーターを指定し、呼び出されたメソッドは呼び出しと同じ順序でパラメーターを受け取ります。次に例を示します。
invoke type MyClass::MyMethod(a,b) ... method-id MyMethod (x as string y as binary-long). ... end method.
上記の引数 a および b は、呼び出されたメソッドに渡され、呼び出されたメソッドのパラメーター x および y にそれぞれ相当します。パラメーターの型は AS 指定で指定します。
invoke type MyClass::MyMethod(param y = 3.141592, param x = "Pi") ... method-id MyMethod (value x as string, y as decimal). ... end method.
呼び出し時にパラメーター x および y が指定されている限り、呼び出されたメソッドはそれらのパラメーターを適切に受け取って使用します。呼び出し時に位置指定引数と名前付き引数を組み合わせて使用する場合は、名前付き引数を位置指定引数の後に指定する必要があります。
invoke type MyClass::MyMethod(a) ... method-id MyMethod (value x as string, y as decimal = 3.141592). ... end method.
上記の呼び出しは、1 つの位置指定引数 (パラメーター x に対応) を渡すのみであるため、オプションのパラメーター y に指定された値がメソッドで使用されます。オプションのパラメーターは、値パラメーターとしてのみ使用できます。
パラメーターは、USING 指定の後に指定された次のいずれかのモードを使用してメソッドに渡されます。
引き渡しモードが指定されていない場合、メソッドのヘッダーで指定されるパラメーターはデフォルトで VALUE モードを使用し、手続き部の見出しで指定されるパラメーターはデフォルトで REFERENCE モードを使用します (値渡しの拡張メソッドを除く)。このデフォルト設定を変更するには、METHODDEFAULT コンパイラ指令を設定します。
複数の値パラメーターを指定する場合、連続する後続のパラメーターに対してはキーワード VALUE が想定されます。次の例では、v および vv は値渡し、それ以外は参照渡しになります。
procedure division using a as binary-long value v as binary-long vv as binary-long reference r as binary-long rr as binary-long.
値パラメーターは、ローカル変数に似た動作をします。その初期値は、メソッドの呼び出し時に確定します。メソッドが処理されると、ローカル変数の値が変わる可能性があります。メソッドが終了しても、呼び出し元コードの元の引数は変わりません。次に例を示します。
declare a as binary-long = 3 invoke type MyUtils::CheckByValue(a) display a *> a is still 3 method-id CheckByValue static (x as binary-long). set x to x + 1 *> x is now 4 end method.
上記の例では、パラメーター a は値渡しになります。呼び出し先のメソッドでは値を増分します。ただし、呼び出し元のコードに戻る際には、変数は変更されません。
使用法:
マネージ型ではなく、他の COBOL データ型の値パラメーターは、「COBOL 型の互換性」表で定義されるとおりに公開されます。例:PIC X フィールドおよびグループは、文字列として公開されます。詳細については、「.NET および JVM COBOL と他の言語の型の互換性」を参照してください。
オプション パラメーターはすべて、オプションではないパラメーターの後に指定する必要があります。
参照パラメーターには、値そのものではなく、必要な値への参照が含まれます。
参照パラメーターは、メソッドの呼び出し時に値が確定し、メソッドの処理中に値が変わる可能性がある、ローカル変数に相当します。値パラメーターとは異なり、メソッドの終了時には、呼び出し元コードの元の引数の値は適宜変更されます。
参照パラメーターは、メソッドに対してローカルな変数のコピーを必ずしも作成するわけではありません。代わりに、メソッドの呼び出し時に使用する場所の元の引数を参照する場合があります。メソッドの処理中に変数はローカルで変わる可能性がありますが、呼び出し元コードの元の引数は必ずしも変わるとは限りません。変わる場合も変わらない場合も両方あり得ます。元の引数の値は、メソッドが終了するまで不明です。メソッドが終了して呼び出し元コードに戻ると、呼び出し元コードの元の引数の値が更新されます。
次に例を示します。
declare a as binary-long=3 invoke type MyUtils::CheckByReference(a) display a *> a is now 4 method-id CheckByReference static (reference x as binary-long). set x to x + 1 *> x is now 4 end method.
上記の例では、パラメーター a は参照渡しになります。呼び出されたメソッドは変数 a を増分します。呼び出し元のコードに戻ると、変数は増分した値で更新されます。
使用法:
Java に相当しない参照パラメーター (PIC X フィールド、グループ、binary-long 以外の数値フィールドなど) は、COBOL ポインターとして公開されます
出力パラメーターは参照パラメーターと同様に、新しい記憶場所を作成するのではなく、呼び出しで指定された変数の記憶場所を使用します。
出力パラメーターは、参照パラメーターと非常に似ています。主な違いは、呼び出し元のコードに戻る前に割り当てられる点です。
次に例を示します。
declare a as binary-long=4 declare b as binary-long invoke type MyUtils::CheckByOutput(a,b) display "Value Param a = " & a *> a is still 4 display "Output Param b = " & b *> b is 16 method-id CheckByOutput static (x as binary-long, output y as binary-long). set x to x + 10 *> x is now 14 set y to x + 2 *> y is now 16 end method.
上記の例では、2 つのパラメーターが渡されます。ここでは、変数 b は初期化されず、出力で渡されます。メソッド CheckByOutput は変数 x および y を更新します。値が戻されると、出力変数 b は更新されますが、変数 a は変更されません。
使用法:
PARAMS キーワードで渡せるパラメーターは 1 つのみで、最後のパラメーターとします。パラメーターの型は 1 次元配列である必要があります。
このメソッドを呼び出すプログラムは、このパラメーターを所定の型の配列として通常の方法で渡せます。または、PARAMS パラメーターに対応する、配列の要素型と同じ型 (または互換型) を持つ 0 個以上のパラメーターを渡すことができます。この場合、コンパイラは、指定されたパラメーターから配列 (0 個以上の要素を含む) を作成するコードを自動的に生成し、この配列を呼び出し先のメソッドに渡します。
RETURNING 項目は、メソッドの結果を呼び出し元のコードに戻します。次に例を示します。
method-id AddMins (a as type MyTimer, b as binary-long) returning c as type MyTimer.
各メソッドには、RETURNING 項目は 1 つしかありません。ただし、戻り情報のセットをオブジェクトでパッケージ化できます。たとえば、次の AddMins() メソッドは、myTime 型のインスタンスを受け取って戻します。
program-id ParamAsObject. 01 myTime type MyTimer value new MyTimer(5 45). procedure division. set myTime to myTime::AddMins(myTime 70) *> inline invocation display myTime::anHour & ":" myTime::aMin end program. class-id MyTimer. 01 anHour binary-long property. *> property keyword enables get/set 01 aMin binary-long property. ... method-id AddMins (a as type MyTimer, b as binary-long) returning c as type MyTimer. 01 h binary-long value 0. 01 m binary-long value 0. set b to a::aMin + b divide b by 60 giving h remainder m set c to new MyTimer(a::anHour + h , m) end method. end class.