Sun Studio 12:Fortran 编程指南

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 中返回 COMPLEXDOUBLE 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 字符串不以空字符终结。