インテル® Fortran の整数ポインター (Cray* 形式ポインターとも呼ばれる) は、Fortran 90 ポインターとは異なり、むしろ C のポインターに似ています。IA-32 アーキテクチャー・ベースのシステムでは、整数ポインターは 4 バイトの INTEGER です。インテル® 64 および IA-64 アーキテクチャー・ベースのシステムでは、整数ポインターは 8 バイトの INTEGER です。
整数ポインターを別の言語のルーチンに渡すには、次の点に注意する必要があります。
Fortran 以外のルーチンでは、引数は適切なデータ型のポインターとして宣言しなければなりません。
Fortran ルーチンから渡される引数は、被参照オブジェクト (ポインターで指定されているオブジェクト) 名ではなく、整数ポインター名でなくてはなりません。
Fortran メインプログラム:
! Fortran main program. INTERFACE SUBROUTINE Ptr_Sub (p) !DEC$ ATTRIBUTES C, DECORATE, ALIAS:'Ptr_Sub' :: Ptr_Sub INTEGER (KIND=INT_PTR_KIND()) p END SUBROUTINE Ptr_Sub END INTERFACE REAL A(10), VAR(10) POINTER (p, VAR) ! VAR is the pointee ! p is the integer pointer p = LOC(A) CALL Ptr_Sub (p) WRITE(*,*) 'A(4) = ', A(4) END !
INTERFACE ブロック内の p の宣言は、インテル® 64 および IA-64 アーキテクチャー・ベースのシステムでは INTEGER(8) p に相当し、IA-32 アーキテクチャー・ベースのシステムでは INTEGER (4) p に相当します。
C サブプログラム:
//C subprogram void Ptr_Sub (float *p) { p[3] = 23.5; }
Fortran のメインプログラムと C の関数をビルドし、実行すると、出力は次のようになります。
A(4) = 23.50000
別の言語のルーチンからポインターを受け取るときには、次の点に注意する必要があります。
Fortran 以外のルーチンでは、引数は適切なデータ型のポインターとして宣言し、通常どおりに渡します。
Fortran ルーチンが受け取る引数は、整数ポインター名として宣言し、POINTER 文でこれを適切なデータ型の被参照オブジェクトに関連付ける必要があります (渡し側のルーチンとデータ型を一致させます)。Fortran ルーチン内では、被参照オブジェクトの変数を使用して、ポインターの指示先を設定し参照します。
Fortran サブルーチン:
! Fortran subroutine. SUBROUTINE Iptr_Sub (p) !DEC$ ATTRIBUTES C, DECORATE, ALIAS:'Iptr_Sub' :: Iptr_Sub INTEGER (KIND=INT_PTR_KIND()) p integer VAR(10) POINTER (p, VAR) OPEN (8, FILE='STAT.DAT') READ (8, *) VAR(4) ! Read from file and store the ! fourth element of VAR END SUBROUTINE Iptr_Sub ! //C main program extern void Iptr_Sub(int *p); main ( void )
C メインプログラム:
//C main program extern void Iptr_Sub(int *p); main ( void ) { int a[10]; Iptr_Sub (&a[0]); printf("a[3] = %i\n", a[3]); }
C のメインプログラムと Fortran のサブルーチンをビルドし、実行すると、STAT.DAT ファイルに "4" が含まれている場合、次の出力が得られます。
a[3] = 4