0

我刚开始使用 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 时,我得到了大量的编译错误(如果你愿意,我可以提供它们)。我有一种感觉,它一定很明显,但我在任何地方都找不到解决方案。是否不打算从非外部代码中调用绑定函数?还是我只是对函数语法了解不足?

4

1 回答 1

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)

于 2014-05-10T17:50:51.320 回答