整数ポインタ (Cray* 形式ポインタとも呼ばれる) は Fortran 90 ポインタとは異なり、むしろ C のポインタに似ています。整数ポインタは、IA-32 システム上では 4 バイトの INTEGER、Itanium® ベース・システム上では 8 バイトの INTEGER です。
整数ポインタを別の言語で書かれたルーチンに渡すには、次の点に注意する必要があります:
Fortran 以外で書かれたルーチンでは、引数は適切なデータ型のポインタとして宣言します。
Fortran ルーチンから渡される引数は、被参照オブジェクト (ポインタに指されているオブジェクト) 名ではなく、整数ポインタ名でなくてはなりません。
次に例を示します。
! Fortran main program.
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 is the pointee
!
p is the integer pointer
p
= LOC(A)
CALL
Ptr_Sub (p)
WRITE(*,*)
'A(4) = ', A(4)
END
!
//C subprogram
void
Ptr_Sub (float *p)
{
p[3]
= 23.5;
}
Itanium ベース・システムでは、INTERFACE ブロック内の p は、INTEGER(8) p で宣言する必要があります。
Fortran のメイン・プログラムと C の関数をビルドし、実行すると、次の出力が得られます:
A(4) = 23.50000
別の言語で書かれたルーチンからポインタを受け取るときには、次の点に注意する必要があります:
Fortran 以外で書かれたルーチンでは、引数は適切なデータ型のポインタとして宣言し、通常どおりに渡します。
Fortran ルーチンが受け取る引数は、整数ポインタ名として宣言し、POINTER 文でこれを適切なデータ型の被参照オブジェクトに関連付ける必要があります (渡し側のルーチンとデータ型を一致させます)。Fortran ルーチン内では、被参照オブジェクトを使って、ポインタの指示先を設定し参照します。
次に例を示します。
!Fortran subroutine.
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) !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 ) { int a[10];
Iptr_Sub (&a[0]);
printf("a[3] = %i\n", a[3]);
}
C のメイン・プログラムと Fortran のサブルーチンをビルドし、実行すると、STAT.DAT ファイルに "4" が含まれている場合、次の出力が得られます:
a[3] = 4