11.4 按值传递数据参数
从 C 中调用时,Fortran 95 程序应在伪参数中使用 VALUE 属性,并且应为从 Fortran 95 中调用的 C 例程提供一个 INTERFACE 块。
表 11–11 在 C 与 Fortran 95 之间传递简单数据元素
Fortran 95 调用 C
|
C 调用 Fortran 95
|
PROGRAM callc
INTERFACE
INTEGER FUNCTION crtn(I)
BIND(C) crtn
INTEGER, VALUE, INTENT(IN) :: I
END FUNCTION crtn
END INTERFACE
M = 20
MM = crtn(M)
WRITE (*,*) M, MM
END PROGRAM
---------------------------------
int crtn(int x)
{
int y;
printf("%d input \n", x);
y = x + 1;
printf("%d returning \n",y);
return(y);
}
---------------------------------
Results:
20 input
21 returning
20 21
|
|
#include <stdlib.h>
int main(int ac, char *av[]) {
to_fortran_(12);
}
--------------------------------
SUBROUTINE to_fortran(i)
INTEGER, VALUE :: i
PRINT *, i
END
|
|
请注意,如果要以不同的数据类型作为实际参数来调用 C 例程,应该在接口块中包含 !$PRAGMA IGNORE_TKR I,以防止编译器在实际参数和伪参数之间要求类型、类别和等级匹配。
对于传统 Fortran 77,按值调用仅对简单数据可用,并且只能为调用 C 例程的 Fortran 77 例程所用。无法做到让 C 例程调用 Fortran 77 例程并按值传递参数。数组、字符串或结构最好是按引用传递。
要将值从 Fortran 77 例程传递到 C 例程,请使用非标准 Fortran 函数 %VAL(arg) 作为调用中的一个参数。
在以下示例中,Fortran 77 例程按值传递 x,按引用传递 y。C 例程同时增加了 x 和 y,但只有 y 发生了改变。
Fortran 调用 C
|
Fortran 例程:
REAL x, y
x = 1.
y = 0.
PRINT *, x,y
CALL value( %VAL(x), y)
PRINT *, x,y
END
|
C 例程:
void value_( float x, float *y)
{
printf("%f, %f\n",x,*y);
x = x + 1.;
*y = *y + 1.;
printf("%f, %f\n",x,*y);
}
|
编译并运行会产生以下输出结果:
1.00000 0. x and y from Fortran
1.000000, 0.000000 x and y from C
2.000000, 1.000000 new x and y from C
1.00000 1.00000 new x and y from Fortran
|
|