c - 重复从 Fortran 调用 C 函数时出现段错误

标签 c segmentation-fault gfortran

我有一个重复调用 C 函数的 Fortran 90 程序。第一次使用该函数一切顺利,但第二次代码尝试访问该函数时出现以下错误:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

我在 Windows 上使用 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 移植。

接口(interface)声明包含这两行

!DEC$ ATTRIBUTES  VALUE :: scen,reg,soil,top,rain,depth,numd,nums,numb,numd,addn,srate,stype

!DEC$ ATTRIBUTES  REFERENCE :: lossx,lossy,ErrStr

IBM fortran 使用以下代码加载库和访问函数:

pointer (q,clover)
p = loadlibrary("clover.dll")
q = getprocaddress(p, "ClOvr")

所以在 GNU fortran 的翻译中我可能遗漏了一些东西

最佳答案

我发现了我的问题:编译时,我必须使用-mrtd (sdtcall)

关于c - 重复从 Fortran 调用 C 函数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11131453/

相关文章:

fortran - 在 gfortran 中预处理 !DEC$ 指令

c++ - 函数的隐式声明 'If'

c - 令人头疼的段错误

C 套接字错误 : "Name or service not known"

c - if 条件下使用关系运算符的段错误

c++ - 将 std::unique_ptr 用于 QMainWindow 时退出时出现 QT 应用程序段错误

gcc - gfortran:尝试执行 'f951' 时出错:execvp:没有这样的文件或目录

recursion - Fortran 95 中的 `Error: Return type mismatch of function`

c - 保存一个程序的输入

c - 结构类型/函数调用