मैं जूलिया से अपने फोरट्रान पुस्तकालय में कार्यों को कॉल करना चाहता हूं। इस मामले में, मेरे पास एक कार्य eye
है जो एक पूर्णांक लेता है, और पूर्णांक की दो-आयामी सरणी देता है।जूलिया से फोरट्रान फ़ंक्शन को कॉल करना, एक सरणी लौटना: अज्ञात फ़ंक्शन, segfault?
julia> n=5
5
julia> ccall((:__matrix_routines_MOD_eye, "/path/to/library/matrix_routines.so"), Array{Int64,2} , (Ptr{Int64},), &n)
:
फोरट्रान मॉड्यूल
$ gfortran -shared -fPIC -o matrix_routines.so matrix_routines.f90
और का उपयोग कर उसके बाद मैं इसे इंटरैक्टिव जूलिया ऐसा दुभाषिया (नाम nm
से प्राप्त) से कॉल करने का प्रयास कर रहा हूँ एक साझा पुस्तकालय में संकलित किया गया है हालांकि, इसके परिणामस्वरूप जूलिया ने मुझे एक सेगफॉल्ट फेंक दिया:
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
प्रतीत नहीं होता है, क्योंकि यह या तो काम नहीं करता है।)
अतिरिक्त प्रश्न के रूप में: क्या जूलिया परिणामी सरणी के स्मृति-अभिविन्यास के साथ कुछ भी करता है? फोरट्रान और जूलिया कॉलम-प्रमुख दोनों हैं, लेकिन मुझे आश्चर्य है कि अगर सीसीएल() के कारण जूलिया सोच सकता है कि उन्हें उन्हें छोटा करना चाहिए?
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
वैकल्पिक तर्कों को फोरट्रान में स्पष्ट इंटरफ़ेस की आवश्यकता होती है आपको पता होना चाहिए कि आग से खेलने से पहले आप क्या कर रहे हैं। सी (और संभवतः iso_c_binding मॉड्यूल) के साथ फोरट्रान 2003 इंटरऑप का उपयोग करना सबसे अच्छा होगा। केवल फोरट्रान 2008 (या 15?) सी इंटरऑपरेबल प्रक्रियाओं के लिए वैकल्पिक तर्क की अनुमति देता है। –
'gfortran -Wall -fcheck = all ...' से कोई उपयोगी आउटपुट? – rickhg12hs
@VladimirF: इसे इंगित करने के लिए धन्यवाद। अब तक, मैं अपने फोरट्रान 'प्रोग्राम' में मॉड्यूल का उपयोग कर रहा था, जिसमें निश्चित रूप से '.mod' फ़ाइल के माध्यम से एक स्पष्ट इंटरफ़ेस है। नोट, मैंने 'वैकल्पिक' तर्क हटा दिया है, लेकिन यह अभी भी एक segfault में परिणाम है। क्या आप सुझाव दे रहे हैं कि मुझे 'iso_c_binding' का उपयोग करना है? @ rickhg12hs: नहीं, कुछ भी नहीं। कोई चेतावनी नहीं – mSSM