如何将动态分配的数组从Julia传递到fortran

时间:2019-06-24 23:24:10

标签: fortran julia

我试图从julia调用一些fortran(f90)代码,但是我似乎无法让fortran理解从julia传递的动态分配的数组。此fortran代码:

MODULE myModule
    implicit none
    public Func
CONTAINS

subroutine Func(A,B)
    integer*8, intent(inout) :: A(3)
    integer*8, intent(inout) :: B(:)
    integer :: i

    write(*,*) "size of A"
    write(*,*) size(A)

    write(*,*) "A"
    do i=1,3
        write(*,*) A(i)
    enddo

    write(*,*) "size of B"
    write(*,*) size(B)

    write(*,*) "B"
    do i=1,size(B)
        write(*,*) B(i)
    enddo

end subroutine Func
end module

此茱莉亚代码调用

A = [1,2,3]
B = [4,5,6]

ccall((:__mymodule_MOD_func,"./test.so"), Nothing ,(Ref{Int64},Ref{Int64}), A,B)

产生这个结果

 size of A
           3
 A
                    1
                    2
                    3
 size of B
           0
 B

我希望大小(B)为3。

是否有任何方法可以使此工作不更改fortran代码?我知道我可以重写fortran代码以在函数调用中包括数组的维数,但是我希望能够调用已经以与我提供的示例类似的方式编写的fortran代码。

1 个答案:

答案 0 :(得分:0)

我决定创建一个fortran包装函数,以接受传入的动态数组的大小。

subroutine wrapFunc(A,B,Bdim)
    integer*8, intent(inout) :: A(3)
    integer*8, intent(inout) :: Bdim
    integer*8, intent(inout) :: B(Bdim)
    call Func(A,B)    

end subroutine wrapFunc

这使我不必更改现有的fortran代码。