ネイティブ COBOL プログラムでのシングル ソーシングおよびデュアル FCD サポート

制約事項: 次の説明はネイティブ COBOL にのみ該当します。

32 ビット開発システムに含まれるシステム コンポーネントはすべて、ファイル制御記述形式の FCD2 および FCD3 をサポートします。64 ビット開発システムに含まれるシステム コンポーネントは FCD3 のみをサポートします。ポインターのサイズに互換性がないため、FCD2 はサポートされません。

開発システムに含まれるシステム コンポーネントはシングル ソースであり、64 ビット用にコンパイルすると 64 ビット システムにおいて FCD3 で動作し、32 ビット用にコンパイルすると 32 ビット システムにおいて FCD2 および FCD3 の両方で動作します。

アプリケーションで FCD3 または FCD2 のいずれか一方のみを使用することができない場合は、このシングル ソーシングの方法を使用することをお勧めします。一方の FCD 形式のみを使用できる場合は、拡張された FCD 構造に対応するために他の条件を考慮する必要はありません。

ただし、アプリケーション内の一部のプログラムがアプリケーション内の他のコンポーネントへのインターフェイスを提供し、それらに FCD 構造が含まれている場合もあります。このような場合は、FCD3 のフル サポートに段階的に移行しなければならないことがあります。そのため、実行時には FCD2 と FCD3 の両方の形式を受け入れ、必要に応じて区別する必要があります。

たとえば、コード内に FCD フィールドへの参照がいくつか存在している場合、次のようなソース コード モデルを使用することができます。

       linkage section.
       01  fcd-user  pic x.
       01  fcd2.
           copy "xfhfcd2".
       01  fcd3.
           copy "xfhfcd3".
       procedure division using fcd-user.
       set address of fcd3  to address of fcd-user
       if  fcd-version of fcd3 = 0
         *> Code to deal with FCD2...
      $if P64 set
       display "Error: cannot accept FCD2 on 64 bit platform"
       goback
      $end
         set address of fcd2  to address of fcd-user
       end-if

FCD のフィールドが参照されるたびに、次のような処理を実行するコードを追加する必要があります。

       if  ( fcd-version of fcd3 not = 0 
          and fcd--line-sequential of fcd3)
       or  ( not fcd-version of fcd3 = 0
       and fcd--line-sequential of fcd2 )
        *> Do line sequential manipulation
       end-if

ただし、コンポーネント内の一連のコードが直接的に FCD 構造を参照している場合は、内部では FCD3 構造のみを使用し、必要に応じて、コンポーネントの入口および出口のゲートウェイで FCD2 との間のマッピングを設定できます。次に例を示します。

       working-storage section.
       78  78-fcd3-map-to-fcd3         value 0.
       78  78-fcd3-map-from-fcd3       value 1.
       78  78-fcd3-map-error-none      value 0.
       78  78-fcd3-map-error-64bit     value -1.
       78  78-fcd3-map-error-func      value -2.
       78  78-fcd3-map-error-reladdr   value -3.
       01  fcd3-work.
       copy "xfhfcd3".
       linkage section.
       01  fcd-user            pic x.
       procedure division using fcd-user.
      *> Entry Gate map FCD2 (if necessary) to FCD3
       call 'fcd3map' using fcd-user fcd3-work
                      by value 78-fcd3-map-to-fcd3 size 1
       if  return-code not = 0 
        display "Error: cannot convert FCD formats"
        goback
       end-if

      *> Operate on the FCD as FCD3 only
      *> ....
      *> Exit Gate map FCD3 (if necessary) to FCD2
       call 'fcd3map' using fcd-user fcd3-work
                      by value 78-fcd3-map-from-fcd3 size 1
     goback.