Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran-C互操作性基本示例_C_Fortran_Mixing - Fatal编程技术网

Fortran-C互操作性基本示例

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 *

我试图学习如何从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 * 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;
}