パラメーターは、メソッドに渡される値参照または変数参照です。これらはメソッドのヘッダーまたは手続き部のヘッダーで指定できます。メソッドのヘッダーで指定されている場合は、そのメソッドから手続き部のヘッダーを省略する必要があります。
パラメーターの実際の値は、メソッドの呼び出し時に指定されます。
通常、メソッドを呼び出す際には、呼び出しでパラメーターを指定し、呼び出されたメソッドは呼び出しと同じ順序でパラメーターを受け取ります。次に例を示します。
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 に指定された値がメソッドで使用されます。オプションのパラメーターは、値のパラメーターとしてのみ使用できます。
詳細については、オプション パラメーターのサンプル ([スタート > すべてのプログラム > Micro Focus Visual COBOL > Samples] の [COBOL for .NET]. から利用可能) を参照してください。
パラメーターは、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 Type Compatibility」表の定義どおりに公開されます。次に例を示します。PIC X フィールドとグループは、文字列として公開されます。詳細については、「」を参照してください。
すべてのオプションのパラメーターは、オプションでないパラメーターの後に指定する必要があります。
参照パラメーターには、値そのものではなく、必要な値への参照が含まれます。
参照パラメーターは、メソッドの呼び出し時に値が確定するローカル変数や、メソッドの処理中に値が変わる可能性があるローカル変数に相当します。値パラメーターとは異なり、メソッドの終了時には、呼び出し元のコードの元の引数の値は適宜変更されます。
参照パラメーターは、メソッドに対してローカルな変数のコピーを必ずしも作成するわけではありません。代わりに、メソッドの呼び出し時に使用する場所の元の引数を参照する場合があります。メソッドの処理中に変数はローカルで変わる可能性がありますが、呼び出し元のコードの元の引数は必ずしも変わるとは限りません。変わる場合も変わらない場合も両方あり得ます。元の引数の値は、メソッドが終了するまで不明です。メソッドが終了して呼び出し元のコードに戻ると、呼び出し元のコードの元の引数の値が更新されます。
次に例を示します。
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 を増分します。呼び出しコードに戻ると、変数は増分した値で更新されます。
使用法:
マネージ タイプに相当しない参照パラメーター (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.