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中调用bind-C函数?_Fortran_Fortran Iso C Binding - Fatal编程技术网

如何在fortran中调用bind-C函数?

如何在fortran中调用bind-C函数?,fortran,fortran-iso-c-binding,Fortran,Fortran Iso C Binding,我刚开始用Fortran,我有一个程序和一个函数 PROGRAM multiplication implicit none real :: A1 !A1 = mult(2, 3) !write(*,1) A1 1 format(f8.8) END PROGRAM multiplication REAL FUNCTION mult(a, b) BIND(C, name='foomult') real,value :: a,b mult

我刚开始用Fortran,我有一个程序和一个函数

PROGRAM  multiplication
    implicit none
    real :: A1

    !A1 = mult(2, 3)
    !write(*,1) A1
    1 format(f8.8)
END PROGRAM multiplication

REAL FUNCTION mult(a, b) BIND(C, name='foomult')
    real,value :: a,b
    mult =  a * b
END FUNCTION

我已经通过JNA让函数在java中工作,但是当我尝试从fortran主程序中调用mult时,我会遇到大量编译错误(如果您需要,我可以提供它们)。我有一种感觉,这肯定是显而易见的,但我在任何地方都找不到解决办法。绑定函数是否不打算从非外部代码中调用?或者我只是对函数语法理解不好?

对于主程序,编译器不“知道”函数的属性,即函数的类型及其参数。函数使用“高级”参数属性
value
,因此有必要以某种方式向调用方声明属性。使调用者知道这些属性的最简单方法是将函数放入模块中,然后从使用该函数的程序或过程中使用该模块:

module MyModule

contains

FUNCTION mult(a, b) BIND(C, name='foomult')
    use iso_c_binding
    real (c_float) ,value :: a,b
    real (c_float) :: mult
    mult =  a * b
END FUNCTION

end module MyModule

PROGRAM  multiplication
    use MyModule
    implicit none
    real :: A1

    A1 = mult(2.0, 3.0)
    write(*,*) A1
END PROGRAM multiplication

我还声明函数中的变量与C兼容。至少在我的计算机上的gfortran中,这些变量与纯实数相同,因此它们与主程序中的调用兼容。兼容性可以通过将调用编写为
mult(2.0_c_float,3.0_c_float)

来保证。另请参见使用带有标签格式语句的Fortran 2003有点奇怪。即使没有
value
也需要显式交互:
bind
是一个充分条件。