我想從Julia的Fortran庫中調用函數。在這種情況下,我有一個函數eye
,它接受一個整數,並返回一個整數的二維數組。從Julia調用Fortran函數,返回一個數組:未知函數,segfault?
的Fortran語言模塊被編譯成使用
$ gfortran -shared -fPIC -o matrix_routines.so matrix_routines.f90
,然後我試圖從交互朱莉婭解釋這樣的(名字來自nm
獲得)稱之爲共享庫:
julia> n=5
5
julia> ccall((:__matrix_routines_MOD_eye, "/path/to/library/matrix_routines.so"), Array{Int64,2} , (Ptr{Int64},), &n)
然而,這立即導致Julia在我身上拋出段錯誤:
signal (11): Segmentation fault
__matrix_routines_MOD_eye at /path/to/library/matrix_routines.so (unknown line)
anonymous at no file:0
unknown function (ip: -1137818532)
jl_f_top_eval at /usr/bin/../lib/julia/libjulia.so (unknown line)
eval_user_input at REPL.jl:53
jlcall_eval_user_input_19998 at (unknown line)
jl_apply_generic at /usr/bin/../lib/julia/libjulia.so (unknown line)
anonymous at task.jl:95
jl_handle_stack_switch at /usr/bin/../lib/julia/libjulia.so (unknown line)
julia_trampoline at /usr/bin/../lib/julia/libjulia.so (unknown line)
unknown function (ip: 4199613)
__libc_start_main at /usr/bin/../lib/libc.so.6 (unknown line)
unknown function (ip: 4199667)
unknown function (ip: 0)
zsh: segmentation fault (core dumped) julia
我是以錯誤的方式調用函數嗎?什麼是函數的正確名稱? (它看起來不只是eye
,因爲這也行不通。)
作爲一個額外的問題:朱莉婭做的任何事情與記憶方向的結果數組? Fortran和Julia都是列專業的,但我想知道是否由於ccall()Julia可能認爲它應該轉移它們?
module matrix_routines
implicit none
private
public :: eye
contains
pure function eye(n,offset) result(um) !{{{
integer, intent(in) :: n
integer, intent(in), optional :: offset
integer, dimension(n,n) :: um
integer :: i, l, u, os
um = 0
l = 1
u = n
os = 0
if (present(offset)) then
os = offset
end if
if (abs(os) < n) then
if (os > 0) then
u = n - os
else if (os < 0) then
l = 1 - os
end if
do i=l, u
um(i, i+os) = 1
end do
end if
end function eye !}}}
end module matrix_routines
可選參數在Fortran中需要顯式接口在玩火之前,您應該知道自己在做什麼。最好的做法是使用帶有C的Fortran 2003 interop(可能還有iso_c_binding模塊)。只有Fortran 2008(或15?)允許C可互操作過程的可選參數。 – 2015-02-07 00:31:23
'gfortran -Wall -fcheck = all ...'有用的輸出嗎? – rickhg12hs 2015-02-07 04:41:25
@VladimirF:謝謝你指出。到目前爲止,我正在使用Fortran程序中的模塊,這當然通過'.mod'文件具有明確的接口。請注意,我已經刪除了'optional'參數,但這仍然導致段錯誤。你是否建議我必須使用'iso_c_binding'? @ rickhg12hs:不,一點都沒有。沒有警告。 – mSSM 2015-02-07 13:52:34