Fortran-C互操作性基本示例
我试图学习如何从C程序中调用Fortran函数或子例程,我举了一个简单的例子: Fortran函数area.f90是Fortran-C互操作性基本示例,c,fortran,mixing,C,Fortran,Mixing,我试图学习如何从C程序中调用Fortran函数或子例程,我举了一个简单的例子: Fortran函数area.f90是 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 *
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 radius\n");
scanf("%lf", &r);
printf("The area is %lf\n", Area_Circle_(&r));
return 0;
}
出口是
area.f90:1:0:
function Area_Circle(r)
Error: Symbol at (1) is not a DUMMY variable
我应该怎么做才能正确编译和运行它
我通常不使用Fortran,但我的一些同事是这样。出于这个原因,我想学习Fortran-C的互操作性。有许多问题需要解决 您的Fortran函数
Area\u Circle
不正确:函数名的类型(即其返回类型)不能具有意图
Fortran标准中定义了一个模块,该模块使Fortran-C的互操作性定义良好且可移植:iso_C_binding
。您应该使用它,例如注意bind(c)
属性和真正的c\u double
Fortran是不区分大小写的s.t。在C程序中,您需要用所有小写字母调用它,即area\u circle
而不是area\u circle
。
使用bind(c,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 radius\n");
scanf("%lf", &r);
printf("The area is %lf\n", area_circle(&r));
return 0;
}
#包括
外部双面积_圆(双*r);
int main(int argc,字符**argv){
双r;
printf(“输入半径\n”);
扫描频率(“%lf”、&r);
printf(“面积为%lf\n”,面积为圆形(&r));
返回0;
}
在这里看一个非常简单的示例,它展示了如何通过C从Python到Fortran。您还有一个基于f90wrap
的示例:@francescalus I附加了一条关于bind
属性的可选name
参数的注释。
#include <stdio.h>
extern double area_circle(double *r);
int main(int argc, char **argv){
double r;
printf("Enter the radius\n");
scanf("%lf", &r);
printf("The area is %lf\n", area_circle(&r));
return 0;
}