整数ポインタの処理

整数ポインタ (Cray* 形式ポインタとも呼ばれる) は Fortran 90 ポインタとは異なり、むしろ C のポインタに似ています。整数ポインタは、IA-32 システム上では 4 バイトの INTEGER、Itanium® ベース・システム上では 8 バイトの INTEGER です。

整数ポインタの渡し方

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

次に例を示します。

! 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 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