11.5.2 複素数データを戻す
複素数データの相互運用性に関する状況は、32 ビットの実装と 64 ビットの SPARC V9 の実装では異なります。
11.5.2.1 32 ビットプラットフォーム
32 ビットプラットフォームで、COMPLEX または DOUBLE COMPLEX を戻す Fortran 関数は、メモリーにある戻り値を指す追加の引数を最初の引数として持つ C の関数と同じです。Fortran 関数と対応する C 関数の一般的な形式は次のとおりです。
Fortran 関数
|
C 関数
|
COMPLEX FUNCTION CF( a1,a2,...,an)
|
|
cf_ (return, a1, a2, ..., an)
struct { float r, i; } *return
|
|
表 11–13 複素数データを戻す関数 (32 ビット SPARC)
Fortran が C を呼び出す
|
C が Fortran を呼び出す
|
COMPLEX U, V, RETCPX
EXTERNAL RETCPX
U = ( 7.0, -8.0)
V = RETCPX(U)
...
------------------------------
struct complex { float r, i; };
void retcpx_( temp, w )
struct complex *temp, *w;
{
temp->r = w->r + 1.0;
temp->i = w->i + 1.0;
return;
}
|
|
struct complex { float r, i; };
struct complex c1, c2;<
struct complex *u=&c1, *v=&c2;
extern retfpx_();
u -> r = 7.0;
u -> i = -8.0;
retfpx_( v, u );
...
------------------------------
COMPLEX FUNCTION RETFPX(Z)
COMPLEX Z
RETFPX = Z + (1.0, 1.0)
RETURN
END
|
|
11.5.2.2 64 ビット SPARC プラットフォーム
64 ビット SPARC 環境では、COMPLEX 値が浮動小数点レジスタに戻されます。COMPLEX と DOUBLE COMPLEX はそれぞれ %f0 と %f1 に戻され、COMPLEX*32 は %f0、%f1、%f2、および %f3 に戻されます。64 ビット SPARC では、要素がすべて浮動小数点型の構造体を返す C 関数は、浮動小数点レジスタで構造体を返します。ただし、そのために必要なレジスタの数が 4 個以下の場合にかぎられます。Fortran 関数と対応する C 関数の一般的な形式は次のとおりです。
Fortran 関数
|
C 関数
|
COMPLEX FUNCTION CF(a1, a2, ...,
an)
|
struct {float r,i;} cf_ (a1, a2,
..., an)
|
表 11–14 複素数データを戻す関数 (64 ビット SPARC)
Fortran が C を呼び出す
|
COMPLEX U, V, RETCPX
EXTERNAL RETCPX
U = ( 7.0, -8.0)
V = RETCPX(U)
...
---------------------------------------------------------
struct complex {float r, i; };
struct complex retcpx_(struct complex *w )
{
struct complex temp;
temp.r = w->r + 1.0;
temp.ii = w->i + 1.0;
return (temp);
}
|
|
C が Fortran を呼び出す
|
struct complex { float r, i; };
struct complex c1, c2;
struct complex *u=&c1;
extern struct complex retfpx_(struct complex *);
u -> r = 7.0;
u -> i = -8.0;
retfpx_( u );
...
---------------------------------------------------------
COMPLEX FUNCTION RETFPX(Z)
COMPLEX Z
RETFPX = Z + (1.0, 1.0)
RETURN
END
|
|