如何在fortran中调用bind-C函数?
我刚开始用Fortran,我有一个程序和一个函数如何在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
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
是一个充分条件。