我需要从Julia中调用此fortran子例程:
SUBROUTINE f90sub(N, a, b)
integer, intent(in) :: N
real(8), intent(in) :: a
real(8), dimension(N) :: b
integer :: i
do i = 1, N
b(i) = a**i ! just an example
end do
END SUBROUTINE f90sub
子例程包含在文件 f90lib.f90 中,该文件可通过以下文件进行编译:
gfortran -shared -fPIC f90lib.f90 -o f90lib.so
如果我尝试从Julia调用子例程,如下所示:
N = 4
a = 2.5
b = zeros(Float64, N)
N_ref = Ref{Int}(N)
a_ref = Ref{Float64}(a)
b_ref = Ref{Array{Float64,1}}(b)
ccall( (:f90sub_, "./f90lib.so"), Cvoid, (Ref{Int},Ref{Float64},Ref{Array{Float64,1}}), N_ref, a_ref, b_ref)
访问b的值时出现段错误。正确的方法是什么?
(SO和其他地方有几个与此类似的问题/答案和示例,但它们似乎都已过时。我使用的是Julia v.1.1.0。Julia文档非常关注C,并且我对Fortran的部分不太清楚;我没有找到任何有用的Fortran示例。)