FORTRAN 77 (Cray) のポインタは、ポインタへのポインタとして C ルーチンに渡すことができます。 これは、Fortran ルーチンが引数を参照で渡すからです。
表 11–10 FORTRAN 77 (Cray) の POINTER を渡す
Fortran が C を呼び出す |
C が Fortran を呼び出す |
||
---|---|---|---|
|
|
C ポインタは Fortran 95 のスカラーポインタとは互換性がありますが、配列ポインタとは互換性がありません。
Fortran 95 がスカラーポインタで C を呼び出す |
||
---|---|---|
Fortran 95 ルーチン:
C ルーチン
|
Cray ポインタと Fortran 95 ポインタの主な違いは、Cray ポインタには常にターゲットが指定されることです。多くの場合、Fortran 95 ポインタを宣言すると、ターゲットは自動的に特定されます。また、呼び出された側の C ルーチンにも明示的な INTERFACE ブロックが必要です。
配列または部分配列への Fortran 95 ポインタを渡すには、次の例のように特定の INTERFACE ブロックが必要です。
Fortran 95 ルーチン INTERFACE SUBROUTINE S(P) integer P(*) END SUBROUTINE S END INTERFACE integer, target:: A(0:9) integer, pointer :: P(:) P => A(0:9:2) !! ポインタは A の要素を 1 つおきに選択 call S(P) ... C ルーチン void s_(int p[]) { /* 中央の要素を変更する */ p[2] = 444; } |
C ルーチン S は Fortran 95 ルーチンでありません。このため、INTERFACE ブロックでは、想定された形 (integer P(:)) でルーチン S を定義することはできません。C ルーチンが配列の実際のサイズを知る必要がある場合は、配列を引数として C ルーチンに渡す必要があります。
C と Fortran では添字付けの方法が異なり、C 配列の添字は 0 から始まることに注意してください。