uCosminexus Interschema ユーザーズガイド

[目次][用語][索引][前へ][次へ]

6.6.4 出現回数決定式

出現回数決定式は,可変回出現コンポーネントの出現数を動的に決める場合に定義します。EXISTWHILE関数又はWHILE関数による式以外は,値が必ず整数値になる式を記述してください。ただし,サイズ決定式と異なり式の値は0でもかまいません。

型コンポーネントのサイズ決定式と同様に,入力フォーマット内では,コンポーネント出現数を動的に決める指定と,出現回数決定式を組にして定義します。出力フォーマットでは,出現数を動的に決める指定だけでもかまいません。

図6-15 出現回数決定式の例

[図データ]

入力フォーマットで指定された場合,出現数を動的に決める指定がされたコンポーネントは,出現回数決定式の評価結果の値数だけデータがあるものとして処理します。上記の例では,Sの出現数はnumの値です。

出力フォーマットで出現数を動的に決める指定がされた場合,コンポーネントが出現回数決定式を持ち,そのコンポーネント評価時点で同式の値が決まるときは,このコンポーネントは出現回数決定式の評価値を出現数とします。出現回数決定式がないか,コンポーネント評価時に式の値が決まらない場合は,マップ式の評価結果に従って出力を制御します。

出力フォーマットでは出現数を動的に決める指定だけを実行し,コンポーネントの出現数はマップ式で制御するのが一般的です。この場合,コンポーネントの出現数を表す型コンポーネントには,評価順序遅延指定のマップ式で出力数を代入するようにします。

図6-15の例では,次のようにマップ式を記述します。

 
numの式:%delay %next = ARRAYSIZE(\1@S);
Sの式:= ...@X[INDEX(0)];
 

 

次に,EXISTWHILE関数又はWHILE関数を使用して出現回数決定式を定義する方法について説明します。

入力フォーマットの場合は,EXISTWHILE関数又はWHILE関数を使用して,条件が満たされる間コンポーネントが出現する指定ができます。EXISTWHILE関数を使用した場合,まだ出現していないデータの値を利用して,コンポーネントの出現の有無を決定できます。コンポーネントの出現の有無は,コンポーネントが評価される時に決定されます。

<この項の構成>
(1) EXISTWHILE関数の使用例
(2) WHILE関数の使用例
(3) EXISTWHILE関数とWHILE関数を組み合わせた使用例
(4) EXISTWHILE関数又はWHILE関数で出現回数決定式を指定する場合の規則

(1) EXISTWHILE関数の使用例

EXISTWHILE関数の使用例を次に示します。

図6-16 EXISTWHILE関数の使用例

[図データ]

図6-16の例は,「Data1」「Data21」「Data22」の出現がコンポーネント中の特定位置のデータで切り替わる例です。「Data1」「Data21」「Data22」の内容は,次のようになっています。

[図データ]

「Data1」の出現回数決定式は,データの先頭4バイト目からの2バイトが0x4431("D1")である間をData1の出現と見なす,という意味になります。同様に「Data21」の場合は,データの先頭4バイト目からの2バイトが0x4432("D2")で,かつ10バイト目からの3バイトが0x232323("###")である間をData21の出現と見なします。「Data22」の場合は,データの先頭4バイト目からの2バイトが0x4432("D2")で,かつ10バイト目からの3バイトが0x232323("###")でない場合をData22の出現と見なします。

EXISTWHILE関数の条件には,固定されたデータ位置を指定する必要があります。ただし,1コンポーネントのデータ長は任意です。

(2) WHILE関数の使用例

WHILE関数の使用例を次に示します。

図6-17 WHILE関数の使用例

[図データ]

図6-17は,レングスタグ構造「ITEM」の可変回繰り返しが,「RECORD」直下のコンポーネント「length」で定義したサイズによって制御される例です。「RECORD」の1出現のサイズは,このコンポーネント「length」で決定されます。ここでは,型コンポーネント「length」のサイズを「4」とします。WHILE関数の条件式の判定で,これまでに読み込んだデータのサイズが「RECORD」のサイズ以内である間,「RECORD」の子コンポーネント「ITEM」が出現すると見なします。

(3) EXISTWHILE関数とWHILE関数を組み合わせた使用例

EXISTWHILE関数とWHILE関数を組み合わせた使用例を次に示します。

図6-18 EXISTWHILE関数とWHILE関数を組み合わせた使用例

[図データ]

図6-18は,同一構成(ヘッダ部「HEAD」とメッセージ部「M1」〜「Mn」)を持つ「MESSAGE」の繰り返しで,「HEAD」の情報が前回と異なる場合に,親コンポーネント「GROUP」が切り替わる例です。初回の条件はWHILE関数,2回目以降はEXISTWHILE関数によって判定されます。なお,EXISTWHILE関数の第4パラメタはバイト列であるため,図6-18の「mno」「name」が文字列の場合,不要文字削除指定を「OFF」にしてください。不要文字削除指定については,「6.1.1(1)(e) 不要文字削除指定」を参照してください。

(4) EXISTWHILE関数又はWHILE関数で出現回数決定式を指定する場合の規則

EXISTWHILE関数又はWHILE関数で出現回数決定式を指定する場合の規則を次に示します。

EXISTWHILE関数で指定した位置にデータが存在しない場合は,関数の指定条件が満たされないため,コンポーネントの出現が終了したと見なされます。また,EXISTWHILE関数の第4パラメタ(判定する値)又はWHILE関数の第1パラメタ(条件式)による評価は,コンポーネントが出現するごとに行われます。EXISTWHILE関数及びWHILE関数については,「6.7.3 関数」を参照してください。