从 Julia 调用 Fortran 子程序。数组有效,但整数无效
Calling Fortran subroutine from Julia. Arrays work, but integers don't
我有这个简单的 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
编译为共享库
gfortran -O2 -shared -fPIC apc_wrapper.f90 -o apc_wrapper.so
现在,我想从 Julia 调用这个子例程,使用所有整数参数,如下所示
i = 2
j = 3
k = 0
ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, &k)
但是不行。 k
不会更改其值并继续评估为 0。
但是,如果我这样做
i = 2
j = 3
kk = [0]
ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, kk)
也就是用一个数组来存放输出,可以!调用子例程后,kk
的计算结果为
1-element Array{Int64,1}:
5
而且我根本没有更改 Fortran 代码,它甚至不知道它在处理一个数组,只是一块内存。
那么,如果 Fortran 能够读取内存块(i
和 j
是正确的红色)为什么不能写入它们?
我对此没有任何问题。实际上,我想使用数组作为输出,但这种行为仍然让我感到惊讶。
好吧,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)
然后 k_ref.x
将计算为 5
。
我有这个简单的 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
编译为共享库
gfortran -O2 -shared -fPIC apc_wrapper.f90 -o apc_wrapper.so
现在,我想从 Julia 调用这个子例程,使用所有整数参数,如下所示
i = 2
j = 3
k = 0
ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, &k)
但是不行。 k
不会更改其值并继续评估为 0。
但是,如果我这样做
i = 2
j = 3
kk = [0]
ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, kk)
也就是用一个数组来存放输出,可以!调用子例程后,kk
的计算结果为
1-element Array{Int64,1}:
5
而且我根本没有更改 Fortran 代码,它甚至不知道它在处理一个数组,只是一块内存。
那么,如果 Fortran 能够读取内存块(i
和 j
是正确的红色)为什么不能写入它们?
我对此没有任何问题。实际上,我想使用数组作为输出,但这种行为仍然让我感到惊讶。
好吧,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)
然后 k_ref.x
将计算为 5
。