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

时间:2014-05-10 14:42:06

标签: 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 =  a * b
END FUNCTION

我已经通过JNA在java中使用了该函数,但是当我尝试从fortran主程序中调用mult时,我得到了大量的编译错误(如果你愿意,我可以提供它们)。我觉得它必须是显而易见的东西,但我无法在任何地方找到解决方案。是否打算从非外部代码中调用绑定函数?或者我对函数语法的理解不足?

1 个答案:

答案 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)来保证兼容性。