構造化レコードを個別のフィールドとして渡す方法

構造化レコードを呼び出し先プログラムに送信し、そこで以下の複数の方法のいずれかで受け取られるように、EGL プロパティーを設定することができます。その複数の方法とは、構造化レコードとして、またはレコードがそのレコード内のリーフ要素に対応する一連の個別フィールドであるかのようにして、またはレコードとフィールドの順次セットとして、というものです。 この使用は特に、EGL コード化ロジックが、Natural プログラミング言語で作成されたコードからマイグレーションされた EGL コード化ロジックと対話する場合に適しています。

この動作は、call ステートメントと呼び出し先プログラムの両方の callingConvention プロパティーの設定に依存しています。 このプロパティー値は、CallingConventionKind.Expanded であるか、または短縮形の Expanded です。

例えば、以下のレコード・パーツを検討します。
Record MyCompletePart type BasicRecord
   10 myInt INT;
   10 myInt02 INT;
   10 myChars CHAR(5);   
end

Record MySubPart type BasicRecord
   10 myInt02 INT;
   10 myChars CHAR(5);
end
一連の宣言は以下のようになります。
myCompleteRecord MyCompletePart;
mySubRecord MySubPart;
myIntVar   INT;
myInt02Var INT;
myCharsVar CHAR(5);
以下の call ステートメントは有効であり、同等です。
call MyProgram( myCompleteRecord )                { callingConvention=Expanded };
call MyProgram( myIntVar, mySubRecord )           { callingConvention=Expanded }; 
call MyProgram( myIntVar, myInt02Var, myCharsVar) { callingConvention=Expanded }; 
以下の MyProgram の定義は、有効であり、同等です。
Program MyProgram  type BasicProgram ( myCompleteRecord MyCompletePart )
   { callingConvention=Expanded }
   
end

Program MyProgram type BasicProgram ( myIntVar INT, mySubRecord MySubPart ) 
   { callingConvention=Expanded }
   
end

Program MyProgram type BasicProgram ( myIntVar INT, myInt02Var INT, myCharsVar CHAR(5))
   { callingConvention=Expanded }
   
end

3 つの call ステートメント引数リストはいずれも、3 つの呼び出し先プログラム・パラメーター・リストのどれに対しても有効です。

ケースのサブセットで、Expanded を使用すると、Expanded を使用しなかった場合よりも呼び出しに長い時間がかかります。 例えば、以下のレコード・パーツに基づくレコードについて考慮してみましょう。
Record X type BasicRecord
	10 myChar CHAR(4)[2];
		20 mySubChar01 char(2);
		20 mySubChar02 char(2);
end

Expanded を使用すると、各リーフ (mySubChar01 または mySubChar02) は、そのリーフ内のフィールドが連続的に保管されていない場合でも、連続的なメモリー・ブロックで渡されます。 データはコピーする必要があり、余分の処理時間がかかります。 多次元構造化フィールド配列の保管方法について詳しくは、『配列』を参照してください。

一般に、パフォーマンスの問題は以下の場合に発生します。

構造化フィールド配列を明示的に受け渡す場合は、『構造化フィールド配列の受け渡し方法』を参照してください。


フィードバック