move

EGL move 文により、データは 3 つの方法のうちいずれかの方法でコピーされます。最初のオプションでは、データは 1 バイトずつコピーされます。2 番目のオプション (「名前順」と呼ばれる) では、1 つの構造体にある指定のフィールドから、別の構造体にある同じ名前のフィールドにデータがコピーされます。3 番目のオプション (「配置順」と呼ばれる) では、1 つの構造体内の各フィールドから、別の構造体内の同じ位置にあるフィールドにデータがコピーされます。

以下の一般的な規則が適用されます。
  • ソース値が次のいずれかである場合、デフォルトでデータが 1 バイトずつコピーされます。
    • プリミティブ変数
    • 固定構造体内にあるフィールド
    • リテラル
    • 定数

    上記以外の場合、デフォルトでデータは名前順にコピーされます。

  • 移動は、フィールド間の互換性をチェックしながら行われます。切り捨て、埋め込み、 および型変換の規則は、assignment 文で詳細に指定されている規則と同じですが、move 文全体の振る舞いは、assignment 文の振る舞いとは異なります。
  • 動的配列を使用している場合、最後のエレメントは、配列の現行サイズによって決まります。move 文は、配列にエレメントを追加しないため、動的配列を拡張するには、その配列固有の関数 appendElement または appendAll を使用します。詳細は『Arrays』 を参照してください。

move 文の構文図

この文を最もよく理解するには、以下のカテゴリーを参照してください。

byName
byName を指定すると、データはソース内の各フィールドから、ターゲット内の同じ名前のフィールドに書き込まれます。操作は、ソースの構造体内での出現順に行われます。

ソースおよびターゲットには、以下を指定することができます。

source
次のいずれか
  • 固定レコードの動的配列。ただし、動的配列は、ターゲットがレコードでない場合にのみ有効です。
  • レコード
  • 固定レコード
  • 副構造を持つ構造体フィールド
  • 副構造を持つ構造体フィールドの配列。ただし、この配列は、ターゲットがレコードでない場合にのみ有効です。
  • データ・テーブル
  • 書式

名前にアスタリスク (*) が付いた固定構造体フィールドは、ソース・フィールドとして使用できませんが、そのフィールドの副構造内にある指定のすべてのフィールドは使用できます。

target
次のいずれか
  • 固定レコードの動的配列。ただし、この配列は、ソースがレコードでない場合にのみ有効です。
  • レコード
  • 固定レコード
  • 副構造を持つ構造体フィールド
  • 副構造を持つ構造体フィールドの配列。ただし、この配列は、ソースがレコードでない場合にのみ有効です。
  • データ・テーブル
  • 書式
例文は次のとおりです。
  move myRecord01 to myRecord02 byName;
以下の場合、操作は無効になります。
  • 同一ソース内に同じ名前のフィールドが複数ある。
  • 同一宛先内に同じ名前のフィールドが複数ある。
  • ソース・フィールドが、多次元の構造体フィールド配列であるか、コンテナーが配列である 1 次元の構造体フィールド配列である。
  • ターゲット・フィールドが、多次元の構造体フィールド配列であるか、コンテナーが配列である 1 次元の構造体フィールド配列である。
この操作は、以下のような場合に有効です。
  • 単純なケースでは、ソースが固定構造体であるが、それ自体が配列エレメントではなく、ターゲットについても同様です。以下の規則が適用されます。
    • 関係する配列がない場合は、ソース構造体内の各従属フィールドの値は、ターゲット構造体内の同じ名前の対応するフィールドにコピーされます。
    • 構造体フィールドの配列が別の構造体フィールドにコピーされる場合、以下のような場合では操作は「move for all」として扱われます。
      • ソース・フィールドのエレメントが、ターゲット・フィールドの後続エレメントにコピーされる
      • ソース配列に含まれているエレメントがターゲット配列よりも少ない場合は、そのソース配列の最後のエレメントがコピーされると処理が停止する
  • 別のケースでは、ソースまたはターゲットがレコードです。ソースのフィールドが、ターゲット内の同じ名前のフィールドに割り当てられます。
  • もう 1 つのケースは、それほど単純ではありませんが、次の例で最もよく説明されます。ソースが 10 個の固定レコードからなる配列であり、それぞれに以下の構造体フィールドが含まれます。
      10 empnum  CHAR(3);
      10 empname CHAR(20); 
    ターゲットは、以下の構造体フィールドを含む固定構造体です。
      10 empnum CHAR(3)[10];
      10 empname CHAR(20)[10];

    この操作により、最初の固定レコード内にあるフィールド empnum の値が、構造体フィールド配列 empnum の最初のエレメントにコピーされます。また最初の固定レコード内にあるフィールド empname の値が、構造体フィールド配列 empname の最初のエレメントにコピーされ、ソース配列内の固定レコードごとに同様の操作が行われます。

    ソースが、以下のような副構造を持つ単一の固定レコードの場合は、同等の操作が発生します。
      10 mySubStructure[10]
        15 empnum  CHAR(3);
        15 empname CHAR(20);    
  • 最後に、ソースが以下の構造体フィールドを含む固定レコードであるケースを考えてみましょう。
      10 empnum  CHAR(3);
      10 empname CHAR(20)[10];
    ターゲットは、以下の副構造を持つ書式、固定レコード、または構造体フィールドです。
      10 empnum char(3)[10];
      10 empname char(20);

    フィールド empnum の値は、ソースからターゲット内の empnum の最初のエレメントにコピーされ、empname の最初のエレメントの値は、ソースからターゲット内のフィールド empname にコピーされます。

byPosition
byPosition は、1 つの構造体の各フィールドから、別の構造体の同じ位置のフィールドにデータをコピーすることを目的としています。

ソースおよびターゲットには、以下を指定することができます。

source
次のいずれか
  • 固定レコードの動的配列。ただし、動的配列は、ターゲットがレコードでない場合にのみ有効です。
  • レコード
  • 固定レコード
  • 副構造を持つ構造体フィールド
  • 副構造を持つ構造体フィールドの配列。ただし、この配列は、ターゲットがレコードでない場合にのみ有効です。
  • データ・テーブル
  • 書式
target
次のいずれか
  • 固定レコードの動的配列。ただし、この配列は、ソースがレコードでない場合にのみ有効です。
  • レコード
  • 固定レコード
  • 副構造を持つ構造体フィールド
  • 副構造を持つ構造体フィールドの配列。ただし、この配列は、ソースがレコードでない場合にのみ有効です。
  • データ・テーブル
  • 書式

レコードと固定構造体との間でデータを移動する場合は、固定構造体の最上位のフィールドのみが考慮されます。2 つの固定構造体間でデータを移動する場合は、どちらかの構造体の最下位 (リーフ) フィールドのみが考慮されます。

ソースまたはターゲット・フィールドが、多次元の構造体フィールド配列であるか、コンテナーが配列である 1 次元の構造体フィールド配列である場合、この操作は無効です。

この操作は、以下のような場合に有効です。
  • 単純なケースでは、ソースが固定構造体であるが、それ自体が配列エレメントではなく、ターゲットについても同様です。以下の規則が適用されます。
    • 関係する配列がない場合は、ソース構造体内の各リーフ・フィールドの値は、ターゲット構造体内の対応する位置にあるリーフ・フィールドにコピーされます。
    • 構造体フィールドの配列が別の構造体フィールドにコピーされる場合、以下のような場合では操作は「move for all」として扱われます。
      • ソース・フィールドのエレメントが、ターゲット・フィールドの後続エレメントにコピーされる
      • ソース配列に含まれているエレメントがターゲット配列よりも少ない場合は、そのソース配列の最後のエレメントがコピーされると処理が停止する
  • 別のケースでは、ソースまたはターゲットがレコードです。ソースの最上位 フィールドまたはリーフ・フィールド (ソース・タイプに応じて) は、ターゲットの最上位フィールドまたはリーフ・フィールド (ターゲット・タイプに応じて) に割り当てられます。
  • もう 1 つのケースは、それほど単純ではありませんが、次の例で最もよく説明されます。ソースが 10 個の固定レコードからなる配列であり、それぞれに以下の構造体フィールドが含まれます。
      10 empnum  CHAR(3);
      10 empname CHAR(20); 
    ターゲットは、以下の構造体フィールドを含む固定構造体です。
      10 empnum CHAR(3)[10];
      10 empname CHAR(20)[10];

    この操作により、最初の固定レコード内にあるフィールド empnum の値が、構造体フィールド配列 empnum の最初のエレメントにコピーされます。また最初の固定レコード内にあるフィールド empname の値が、構造体フィールド配列 empname の最初のエレメントにコピーされ、ソース配列内の固定レコードごとに同様の操作が行われます。

    ソースが、以下のような副構造を持つ単一の固定レコードの場合は、同等の操作が発生します。
      10 mySubStructure[10]
        15 empnum  CHAR(3);
        15 empname CHAR(20);    
  • 最後に、ソースが以下の構造体フィールドを含む固定レコードであるケースを考えてみましょう。
      10 empnum  CHAR(3);
      10 empname CHAR(20)[10];
    ターゲットは、以下の副構造を持つ書式、固定レコード、または構造体フィールドです。
      10 empnum char(3)[10];
      10 empname char(20);

    フィールド empnum の値は、ソースからターゲット内の empnum の最初のエレメントにコピーされ、empname の最初のエレメントの値は、ソースからターゲット内のフィールド empname にコピーされます。

for all
for all は、ターゲット配列内のすべてのエレメントに値を割り当てることを目的としています。

ソースおよびターゲットには、以下を指定することができます。

source
次のいずれか
  • レコード、固定レコード、またはプリミティブ変数の動的配列
  • レコード
  • 固定レコード
  • 副構造を持つ構造体フィールド、または持たない構造体フィールド
  • 副構造を持つ構造体フィールド配列、または持たない構造体フィールド配列
  • プリミティブ変数
  • リテラルまたは定数
target
次のいずれか
  • レコード、固定レコード、またはプリミティブ変数の動的配列
  • 副構造を持つ構造体フィールド配列、または持たない構造体フィールド配列
  • 動的または構造体フィールド配列のエレメント

このケースの move 文は、複数の assignment 文 (ターゲット配列エレメントごとに 1 つずつ) と同等であり、割り当ての試行が無効な場合、エラーが発生します。有効性の詳細については、『代入』を参照してください。

ソースまたはターゲット・エレメントに固定構造体がある場合、 move 文は、構造体のトップレベルが別のプリミティブ型を指定しないかぎり、この構造体を CHAR 型のフィールドとして扱います。 for all が使用中のときは、move 文は、副構造を考慮しません。

ソースが配列のエレメントである場合、そのソースは、指定されたエレメントが最初のエレメントである配列として扱われ、前のエレメントは無視されます。

ソースが配列または配列のエレメントである場合は、そのソース配列の後続の各エレメントは、ターゲット配列の次のエレメントに順次コピーされます。ターゲット配列またはソース配列のいずれかが他方より長くても問題ありません。この場合は、他の配列と一致するエレメントを持つ最後のエレメントからデータがコピーされると、操作が終了します。

ソースが配列でも、配列のエレメントでもない場合、この操作はソースの値を使用して、ターゲット配列のすべてのエレメントを初期化します。

for count
for count は、値をターゲット配列内のエレメントの順次サブセットに割り当てることを目的としています。以下に例を示します。
  • 次の文では、「abc」をターゲット内のエレメント 7、8、および 9 に移動します。
      move "abc" to target[7] for 3
  • 次の文では、ソースのエレメント 2、3、および 4 が、ターゲットのエレメント 7、8、および 9 に移動します。
      move source[2] to target[7] for 3

この操作は、以下のような場合に有効です。

  • ソースが配列でも、配列のエレメントでもない場合、この操作はソースの値を使用して、ターゲット配列のエレメントを初期化します。
  • ソースが配列である場合、その配列の最初のエレメントが、コピーされる一連のエレメント内で最初のエレメントになります。ソースが配列のエレメントである場合、そのエレメントが、コピーされる一連のエレメント内で最初のエレメントになります。
  • ターゲットが配列である場合、その配列の最初のエレメントが、データを受け取る一連のエレメント内で最初のエレメントになります。ターゲットが配列のエレメントである場合、そのエレメントが、データを受け取る一連のエレメント内で最初のエレメントになります。
count」値は、データを受け取るターゲット・エレメントの数を指定します。この値は、以下のいずれかにすることができます。
  • 整数リテラル
  • 整数に解決する変数
  • 数式。ただし、関数呼び出しではありません。

move 文は、複数の assignment 文 (ターゲット配列エレメントごとに 1 つずつ) と同等であり、割り当ての試行が無効な場合、エラーが発生します。有効性の詳細については、『代入』を参照してください。

ソースまたはターゲット・エレメントに内部構造体がある場合、 move 文は、構造体のトップレベルが別のプリミティブ型を指定しないかぎり、この構造体を CHAR 型のフィールドとして扱います。 for count が使用中のときは、 move 文は、副構造を考慮しません。

ソースおよびターゲットの両方が配列であるときは、ターゲットの配列またはソースの配列のいずれかが他方よりも長くてもかまいません。この場合 、次の 2 つのイベントの内、最初のイベントが発生した後に操作が終了します。
  • 操作要求の対象となる最後のエレメントの間でデータがコピーされたとき
  • 他の配列と一致するエレメントを持つ最後のエレメントからデータがコピーされたとき
ソースが配列でない場合は、次の 2 つのイベントのうち、最初のイベントが発生した後にこの操作は終了します。
  • 操作要求の対象となる最後のエレメントにデータがコピーされたとき
  • 配列内で最後のエレメントにデータがコピーされたとき

ソースがレコード配列 (またはレコード配列のエレメント) である場合、ターゲットはレコード配列でなければなりません。 ソースがプリミティブ変数配列 (またはプリミティブ変数配列のエレメント) である場合、ターゲットはプリミティブ変数配列または構造体フィールド配列でなければなりません。 ソースが構造体フィールド配列 (または構造体フィールド配列のエレメント) である場合、ターゲットはプリミティブ変数配列または構造体フィールド配列でなければなりません。

関連する参照項目
配列
代入

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.
(C) Copyright IBM Japan 2005.