単一ソースと 2 つの FCD のサポート

32 ビット開発システムで提供されるすべてのシステム コンポーネントは、FCD 2 および FCD 3 をサポートします。64 ビット開発システムの場合、提供されるシステム コンポーネントは FCD 3 のみをサポートします。ポインタ サイズに互換性がないため、システム コンポーネントは FCD 2をサポートできません。32 ビットと 64 ビットのシステム コンポーネントには、同じソースを利用することができます。つまり、P64 でコンパイルすると、そのコンポーネントは、64 ビット システムの FCD 3 上で動作し、P64 以外でコンパイルすると、そのコンポーネントは、32 ビット システムの FCD 2 と FCD 3 の両方で動作します。独自のアプリケーションを開発する場合は、この単一ソースのアプローチを取ることをお勧めします。

開発システムは両方の形式の FCD をサポートしているため、アプリケーションでは、次のいずれかを使用できます。


アプリケーションで FCD 3 または FCD 2 のいずれか一方だけを利用できる場合、拡張された FCD 構造に対応するために、その他の条件を考慮する必要はありません。

ただし、アプリケーション内の一部のプログラムがアプリケーション内の他のコンポーネントにインターフェイスを提供しており、これらのインターフェイスに FCD 構造が含まれている場合もあります。この場合、FCD 3 の全面サポートに向けて段階的に移行する必要があります。したがって、実行時には、プログラムは FCD 2 形式と FCD 3 形式の両方に対応して、必要に応じてこれらを識別する必要があります。たとえば、コード内に 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
         *> Dealing with FCD2..
$if P64 set
        display "Error: cannot accept FCD2 on 64 bit platform"
        exit program
$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 構造を参照している場合、内部で FCD 3 構造のみを使用することができます。また、必要に応じて、コンポーネントのエントリ ゲートウェイとイグジット ゲートウェイで、FCD 2 を対象としたマッピングを設定できます。次に例を示します。

 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"
        exit program
     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
     exit program.