Fortran-C互操作基本示例



我正在尝试学习如何从C程序中调用Fortran函数或子程序,我做了这个简单的例子:

Fortran函数区。法郎是

function Area_Circle(r)
implicit none
real(kind(1.d0)) , intent(out):: Area_Circle
real(kind(1.d0)), intent(in) :: r
real(kind(1.d0)), parameter :: Pi = acos(-1.d0)
Area_Circle = Pi * r * r
end function Area_Circle

和C main.c程序

#include <stdio.h>
extern double Area_Circle_(double *r);
int main(int argc, char **argv){
double r;
printf("Enter the radiusn");
scanf("%lf", &r);
printf("The area is %lfn", Area_Circle_(&r));
return 0;
}

我尝试用命令

编译和构建
gcc -o app main.c area.f90 -lgfortran

,出口为

area.f90:1:0:
function Area_Circle(r)

Error: Symbol at (1) is not a DUMMY variable

我应该做些什么来编译和正确运行这个?

p。d。我通常不用Fortran语言工作,但我的一些同事会。因此,我想学习Fortran-C的互操作性。

有很多事情需要解决。

你的Fortran函数Area_Circle不正确:函数名的类型也就是它的返回类型不能有intent

在Fortran标准中定义了一个模块iso_c_binding,它使Fortran- c的互操作性得到了良好的定义和可移植性。你应该利用它,例如注意bind(c)属性和真正的c_double

Fortran是不区分大小写的,所以你需要在你的C程序中用小写来调用它,即area_circle而不是Area_Circle_。此行为可以通过使用bind(c, name="<some_name>")来覆盖。


Fortran文件area.f90

function Area_Circle(r) bind(c)
use, intrinsic :: iso_c_binding
implicit none
real(c_double), intent(in) :: r
real(c_double)             :: Area_Circle
real(c_double), parameter :: PI = acos(-1.d0)
Area_Circle = PI * r * r
end function

C文件main.c

#include <stdio.h>
extern double area_circle(double *r);
int main(int argc, char **argv){
double r;
printf("Enter the radiusn");
scanf("%lf", &r);
printf("The area is %lfn", area_circle(&r));
return 0;
}

最新更新