11.5 返回值的函数
返回 BYTE、INTEGER、REAL、LOGICAL、DOUBLE PRECISION 或 REAL*16 类型值的 Fortran 函数与返回兼容类型的 C 函数是等同的(请参见表 11–1)。字符型函数的返回值存在两个额外参数,复数型函数的返回值存在一个额外参数。
11.5.1 返回简单数据类型
下例返回一个 REAL 或 float 值。BYTE、INTEGER、LOGICAL、DOUBLE PRECISION 和 REAL*16 的处理方式类似:
表 11–12 返回 REAL 或 Float 值的函数
Fortran 调用 C
|
C 调用 Fortran
|
real ADD1, R, S
external ADD1
R = 8.0
S = ADD1( R )
...
------------------------------
float add1_( pf )
float *pf;
{
float f ;
f = *pf;
f++;
return ( f );
}
|
|
float r, s;
extern float fadd1_() ;
r = 8.0;
s = fadd1_( &r );
...
------------------------------
real function fadd1 (p)
real p
fadd1 = p + 1.0
return
end
|
|
11.5.2 返回 COMPLEX 数据
COMPLEX 数据的互操作性情况在 SPARC 32 位和 64 位实现之间有所不同。
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 返回 COMPLEX 数据的函数(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 值: 在 %f0 和 %f1 中返回 COMPLEX 和 DOUBLE COMPLEX,在 %f0、%f1、%f2 和 %f3 中返回 COMPLEX*32。对于 64 位 SPARC,返回结构(其字段均为浮点型)的 C 函数将在浮点寄存器中返回该结构,但条件是最多需要 4 个这样的寄存器进行此操作。在 64 位 SPARC 平台上,Fortran 函数及其相应的 C 函数的一般样式如下:
Fortran 函数
|
C 函数
|
COMPLEX FUNCTION CF(a1, a2, ...,
an)
|
struct {float r,i;} cf_ (a1, a2,
..., an)
|
表 11–14 返回 COMPLEX 数据的函数(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
|
|
11.5.3 返回 CHARACTER 串
不鼓励在 C 与 Fortran 例程之间传递字符串。但是,具有字符串值的 Fortran 函数等同于具有两个附加第一参数(数据地址和串长度)的 C 函数。Fortran 函数及其相应的 C 函数的一般样式如下:
Fortran 函数
|
C 函数
|
CHARACTER*n FUNCTION
C(a1, ..., an)
|
void c_ (result, length, a1, ..., an)
char result[ ];
long length;
|
|
以下是一个示例
表 11–15 返回 CHARACTER 串的函数
Fortran 调用 C
|
C 调用 Fortran
|
CHARACTER STRING*16, CSTR*9
STRING = ’ ’
STRING = ’123’ // CSTR(’*’,9)
...
------------------------------
void cstr_( char *p2rslt,
long rslt_len,
char *p2arg,
int *p2n,
long arg_len )
{ /* return n copies of arg */
int count, i;
char *cp;
count = *p2n;
cp = p2rslt;
for (i=0; i<count; i++) {
*cp++ = *p2arg ;
}
}
|
|
void fstr_( char *, long,
char *, int *, long );
char sbf[9] = "123456789";
char *p2rslt = sbf;
int rslt_len = sizeof(sbf);
char ch = ’*’;
int n = 4;
int ch_len = sizeof(ch);
/* make n copies of ch in sbf
*/
fstr_( p2rslt, rslt_len,
&ch, &n, ch_len );
...
------------------------------
FUNCTION FSTR( C, N)
CHARACTER FSTR*(*), C
FSTR = ’’
DO I = 1,N
FSTR(I:I) = C
END DO
FSTR(N+1:N+1) = CHAR(0)
END
|
|
在本例中,C 函数和调用 C 例程必须在列表(字符参数的长度)末尾提供两个额外的初始参数(指向结果字符串和串长度的指针)和一个附加参数。请注意,在从 C 中调用的 Fortran 例程中,需要显式添加一个末尾空字符。缺省情况下,Fortran 字符串不以空字符终结。