Compaq Fortran (整数) ポインタは,Fortran 95/90 ポインタと同じものではなく,むしろ C のポインタに似ています。ia32 システムでは,Compaq Fortran ポインタは 4 バイトの INTEGER です。ia64 システムでは,Compaq Fortran ポインタは 8 バイトの INTEGER です。
Compaq Fortran ポインタを別の言語で書かれたルーチンに渡すときには,次の点に注意する必要があります。
Fortran 以外のルーチンでは,引数は適切なデータ型のポインタとして宣言します。
次に ia32 システムでの例を示します。
Fortran コード:
! 主プログラム INTERFACE SUBROUTINE Ptr_Sub (p) !DEC$ ATTRIBUTES C, ALIAS:'_Ptr_Sub' :: Ptr_Sub INTEGER p END SUBROUTINE Ptr_Sub END INTERFACE REAL A(10), VAR(10) POINTER (p, VAR) ! VAR はポインタ変数で p は整数型 p = LOC(A) CALL Ptr_Sub (p) WRITE(*,*) 'A(4) = ', A(4) END
C コード:
//副プログラム void Ptr_Sub (float *p) { p[3] = 23.5; }
ia64 システムでは,次のように,Ptr_Sub の別名の先頭に下線は付けません。
!DEC$ ATTRIBUTES C, ALIAS:'Ptr_Sub' :: Ptr_Sub
Fortran の主プログラムと C の関数をビルドし,実行すると,次の出力が得られます。
A(4) = 23.50000
別の言語で書かれたルーチンからポインタを受け取るときには,次の点に注意する必要があります。
Fortran 以外のルーチンでは,引数は適切なデータ型のポインタとして宣言し,通常どおりに渡します。
次に ia32 システムの例を示します。
Fortran コード:
! サブルーチン SUBROUTINE Iptr_Sub (p) !DEC$ ATTRIBUTES C, ALIAS:'_Iptr_Sub' :: Iptr_Sub integer VAR(10) POINTER (p, VAR) OPEN (8, FILE='STAT.DAT') READ (8, *) VAR(4) ! ファイルから読み取り, ! VAR の第 4 要素に保存します。 END SUBROUTINE Iptr_Sub
C コード:
//主プログラム extern void Iptr_Sub(int *p); main ( void ) { int a[10]; Iptr_Sub (&a[0]); printf("a[3] = %i\n", a[3]); }
ia64 システムでは,次のように,Iptr_Sub の別名の先頭に下線は付けません。
!DEC$ ATTRIBUTES C, ALIAS:'Iptr_Sub' :: Iptr_Sub
C の主プログラムと Fortran のサブルーチンをビルドし,実行すると,STAT.DAT ファイルに "4" が含まれている場合,次の出力が得られます。
a[3] = 4