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 から始まることに注意してください。