我刚开始使用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时,我得到了大量的编译错误(如果你愿意,我可以提供它们)。我觉得它必须是显而易见的东西,但我无法在任何地方找到解决方案。是否打算从非外部代码中调用绑定函数?或者我对函数语法的理解不足?
答案 0 :(得分:2)
对于主程序,编译器不会知道"函数的属性,即函数的类型及其参数。您的功能使用"高级"参数属性value
,因此有必要以某种方式向调用者声明属性。让调用者知道这些属性的最简单方法是将函数放入一个模块中,并use
该模块来自使用它的程序或过程:
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)
来保证兼容性。