2012-06-21 5 views
1

У меня есть программа 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

+0

Функция C должна быть разбита. Но вы не предоставляете никакой информации, которая поможет понять, почему. – ugoren

+0

, обеспечивающий функцию C, поможет. проверьте переменные вокруг кода, вы можете найти там ошибку/исправить. – RoyalJai

+0

Как вы получаете SIGSEGV в Windows? Вы получили свалку ядра? – cdarke

ответ

0

Я нашел свою проблему: при компиляции я должен использовать -mrtd (sdtcall)

Смежные вопросы