从Julia调用Fortran子程序.数组工作,但整数不工作

Ger*_*tta 7 fortran fortran90 julia

我有这个简单的Fortran 90程序:

subroutine apc_wrapper(i, j, k)
implicit none

integer*8, intent(in) :: i, j
integer*8, intent(out) :: k
double precision t

k = i + js 
end subroutine
Run Code Online (Sandbox Code Playgroud)

编译为共享库

gfortran -O2 -shared -fPIC apc_wrapper.f90 -o apc_wrapper.so
Run Code Online (Sandbox Code Playgroud)

现在,我想从Julia调用这个子例程,带有所有整数参数,就像这样

i = 2
j = 3
k = 0

ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, &k)
Run Code Online (Sandbox Code Playgroud)

但它不会起作用.k不会改变它的值并继续评估为0.

但是,如果我这样做

 i = 2
 j = 3
 kk = [0]

 ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, kk)
Run Code Online (Sandbox Code Playgroud)

也就是说,使用数组存储输出,它的工作原理!调用子例程后,kk求值为

 1-element Array{Int64,1}:
 5
Run Code Online (Sandbox Code Playgroud)

我根本没有改变Fortran代码,它甚至不知道它处理的是数组,只是一块内存.

那么,如果Fortran能够读取内存块(i并且j是正确的红色),为什么不能写入它们?

我对此没有任何问题.实际上,我想使用数组作为输出但仍然,这种行为让我感到惊讶.

Ger*_*tta 9

好吧,Julia是一种快节奏的开发语言,结果是&variable语法被弃用了.这将是执行此操作的正确方法:

i = 2
j = 3
k = 0
i_ref = Ref{Int64}(i)
j_ref = Ref{Int64}(j)
k_ref = Ref{Int64}(k)

ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void,
(Ref{Int64}, Ref{Int64}, Ref{Int64}),
i_ref, j_ref, k_ref)
Run Code Online (Sandbox Code Playgroud)

然后k_ref.x将评估为5.