整数ポインターの処理

インテル(R) Fortran の整数ポインター (Cray* 形式ポインターとも呼ばれる) は、Fortran 90 ポインターとは異なり、むしろ C のポインターに似ています。IA-32 アーキテクチャー・ベースのシステムでは、整数ポインターは 4 バイトの INTEGER です。インテル(R) 64 および IA-64 アーキテクチャー・ベースのシステムでは、整数ポインターは 8 バイトの INTEGER です。

整数ポインターを別の言語のルーチンに渡すには、次の点に注意する必要があります。

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 の宣言は、インテル(R) 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 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