У меня есть программа Fortran 90, которая повторно вызывает функцию C. Первый раз, когда функция используется все идет хорошо, но второй раз код пытается получить доступ к функции дает следующее сообщение об ошибке:Ошибка сегментации при вызове функции C из Fortran повторно
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Я использую gfortran v.4.6 на окнах, связывающий в библиотеку который у меня нет исходного кода. Библиотека пришла ко мне как DLL, и я использовал gendef и dlltool для создания библиотеки .a для связи.
код выглядит следующим образом:
PROGRAM cmod
USE, INTRINSIC :: ISO_C_BINDING
INTERFACE
LOGICAL (C_BOOL) FUNCTION clover(scen,reg,soil,top,rain,depth,numd,nums,numb, numd,addn,srate,stype,nloss,ploss,ErrStr) BIND (C, name = "ClOvr")
USE, INTRINSIC :: ISO_C_BINDING
INTEGER (C_INT), INTENT(IN), VALUE :: scen,reg,soil,topo,depth
REAL (C_DOUBLE), INTENT(IN), VALUE :: rain,numd,nums,numb,numd
REAL (C_DOUBLE), INTENT(IN), VALUE :: addn,srate
INTEGER (C_INT), INTENT(IN), VALUE :: stype
REAL (C_DOUBLE), INTENT(OUT) :: nloss,ploss
CHARACTER(C_CHAR), INTENT(OUT) :: ErrStr(*)
END FUNCTION clover
END INTERFACE
.....
do
.....
result = clover(a,b,c, d, e, f, g, h, sb, sd, an, sr, st,lossx,lossy,err)
......
result = clover(a,b,c, d, e, f, g, h, sb, sd, an, sr, st,lossx,lossy,err)
end do
END PROGRAM cmod
У меня нет кода C, но я портирования от IBM Fortran.
Декларация интерфейс содержит следующие две строки
!DEC$ ATTRIBUTES VALUE :: scen,reg,soil,top,rain,depth,numd,nums,numb,numd,addn,srate,stype
!DEC$ ATTRIBUTES REFERENCE :: lossx,lossy,ErrStr
Фортран IBM использует следующий код для загрузки библиотеки и доступ к функции:
pointer (q,clover)
p = loadlibrary("clover.dll")
q = getprocaddress(p, "ClOvr")
Так что, возможно, отсутствует что-то в переводе to GNU fortran
Функция C должна быть разбита. Но вы не предоставляете никакой информации, которая поможет понять, почему. – ugoren
, обеспечивающий функцию C, поможет. проверьте переменные вокруг кода, вы можете найти там ошибку/исправить. – RoyalJai
Как вы получаете SIGSEGV в Windows? Вы получили свалку ядра? – cdarke