A Fortran function returning COMPLEX or DOUBLE COMPLEX is equivalent to a C function with an additional first argument that points to the return value in memory. The general pattern for the Fortran function and its corresponding C function is:
Fortran function |
C function |
---|---|
COMPLEX FUNCTION CF(a1, a2, ..., an) |
cf_ ()return, a1, a2, ..., an struct { float r, i; } *;return |
Table 11-14 Function Returning COMPLEX Data
Fortran calls C |
C calls 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 |
In 64-bit environments and compiling with -xarch=v9, COMPLEX values are returned in floating-point registers: COMPLEX and DOUBLE COMPLEX in %f0 and %f1, and COMPLEX*32 in %f0, %f1, %f2, and %f3.