c++ - 在 C++ 绑定(bind)中捕获 Fortran 运行时错误和信号

标签 c++ fortran language-binding

我希望能够在 C++ 绑定(bind)中捕获终止的 Fortran 运行时错误。 我有一个遗留的 F90 代码可以绑定(bind)并期待各种错误,例如数值、IO等

我设法根据以下内容处理 STOP: Intercepting Fortran STOP from C++ 并能够在 C++ 代码中针对这种情况抛出/捕获异常。

我对“Fortran 中的信号处理”有了一些了解 https://www.sharcnet.ca/help/images/4/42/Fortran_Signal_Handling.pdf

但是我无法解决这个问题,一个 f90 fortran 的例子会很有帮助。

例如,尝试在 fortran 子例程中打开一个不存在的文件会产生运行时错误,并且 C++ 代码终止:

打开(unit=13,FILE="fnameBAD",status="old",action="read",position="rewind")

Fortran 运行时错误:无法打开文件“fnameBAD”:没有那个文件或目录

我希望能够使用信号捕获此错误和其他运行时错误。

最佳答案

这行不通,至少对于 GFortran。当 OPEN 语句失败时,GFortran 运行时库将自行关闭,只有 finally 才会生成信号。因此,当您可以在信号处理程序中捕获信号时,libgfortran 已经自行关闭(包括关闭所有打开的文件)。

正如 Vladimir F 在评论中所说,解决方案是使用 iostat= 说明符捕获 OPEN 语句中的错误。

关于c++ - 在 C++ 绑定(bind)中捕获 Fortran 运行时错误和信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518283/

相关文章:

c++ - 如何让 LLVM 更喜欢一条机器指令而不是另一条机器指令?

c++ - 在 MSVC 上包含 windows.h 时,godbolt 无法链接?

C++ 角度、三角学

c - 纯 C 中的符号计算库

python - 如何将 Ruby 与 Mercurial (Python) 连接起来?

c - 在Elixir/Erlang中运行C代码: Ports or NIFs?

c++ - c++新手被卡住了

arrays - Fortran:普通数组与存储相同数据量的对象所需的 RAM

fortran - 停止变量中的代码?

fortran - 测量 Fortran 程序所花费的时间