整数ポインターの処理

インテル® Fortran の整数ポインター (Cray* 形式ポインターとも呼ばれる) は、Fortran 90 ポインターとは異なり、むしろ C のポインターに似ています。IA-32 アーキテクチャー・ベースのシステムでは、整数ポインターは 4 バイトの INTEGER です。インテル® 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 の宣言は、インテル® 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