在 Julia 中调用 Fortran 与调用 C 几乎完全相同。作为示例,我们在 interoperability/fortran 目录下提供了一个简单的动态链接库 libJuliaFortran,其中包含了几个简单的 Fortran 函数。
interoperability/fortran/src/lib.f90
module Juliainteger:: last =0;containssubroutine add(a,b,c)implicitnoneinteger, intent(in):: a,binteger, intent(out):: c c = a + b last = cend subroutine addfunction fadd(a,b) result(c)implicitnoneinteger, intent(in):: a,binteger:: c c = a + bend function faddsubroutine vadd(a,b,c,n)implicitnoneinteger, intent(in):: n, a(n), b(n)integer, intent(out):: c(n) c = a + bend subroutine vaddend module
调用 Fortran 函数时,传入的标量类型必须是引用类型,而不是值类型。例如,Int32 不能被传入,而必须使用 Ref{Int32}。所以,在上面的例子中,我们将 ans 定义为 Ref(Int32(0)) 而不是直接定义为 Int32(0),否则我们无法得到正确的结果。
读者可能会注意到我们并没有对 1 或 2 进行包装,这是因为 Julia 会自动对它们进行包装,因此我们可以直接将它们传入 Fortran 函数。但对于我们需要获取的 ans 来说,如果由 Julia 自动包装,Fortran 将会对包装后的指针进行修改,而 Julia 这边 ans 的值将不会发生变化,就像下面这样: