【问题标题】:How to handle Fortran RTL error with JNA?如何使用 JNA 处理 Fortran RTL 错误?
【发布时间】:2020-11-07 03:11:35
【问题描述】:

我正在使用 JNA 运行一个共享库(使用 Intel 编译)。在极少数情况下,Fortran 调用以 forrtl : severe 代码结束。类似的东西

forrtl: severe (408): fort: (3): Subscript #1 of the array IWU has value 0 which is less than the lower bound of 1

有没有办法使用 JNA “捕捉”这个运行时错误?

【问题讨论】:

  • 我认为修复该错误会更好,Fortran 默认使用索引 1 开始其数组,而您的代码中可能没有考虑到这一点。
  • 当错误没有发生时你确定结果正确吗?
  • @albert 当然会,但这非常困难。我们在大数据环境中运行这个 Fortran 模拟(数百万个不同的输入,其中一些可能是错误的(不现实的),一定的容错性会很好。
  • 是的,容错可能是必要的,但这涉及程序中的数据和数据的处理,而不是下标错误,因为这清楚地表明了一个编程错误,其中一个条件没有正确处理,从而导致在不正确的索引中。在后一种情况下,应设置通过 JNI 返回的错误代码/消息,或者应选择正确的索引。

标签: java error-handling fortran jna error-code


【解决方案1】:

没有将错误代码从本机代码传递到 JNA 的通用机制。充其量,JNA 会从函数的返回值知道函数失败。

但是,如果本机代码提供了读取这些错误代码的方法(例如,Windows GetLastError() 函数,或 Linux 和 macOS 上的全局 errno 变量),则可以检索更具体的详细信息。

对于 Intel Fortran“严重”错误,程序执行会停止,除非它在本机端进行处理,所以我认为您无法在 JNA 中“捕获”它,除非它已经在库中“捕获”您正在使用...在这种情况下,您只需要对失败的方法调用做出适当的反应。可以修改 Fortran 源以捕获一些运行时错误(例如在I/O、动态内存管理或图像控制中)并返回此状态。但是,对于这个问题的特定数组边界错误,这可能不适用。

【讨论】:

  • iostaterrsns 适用于 I/O 系统条件。数组访问越界不是那里产生的错误。
  • 它在链接的列表中,其中包括一个1 后标,用于表示 IOSTAT 未返回的错误。 408 上没有1。但我不知道。这就是为什么我说“可能”。否则,其余答案总结情况。
  • 引用该链接中的表描述:“在下表的示例消息中,第一列列出了在检测到 I/O 错误时返回给 IOSTAT 变量的错误号。” “IOSTAT”变量在 I/O 语句中用作避免程序终止的一种方式(因此不会在任何错误终止 I/O 语句中使用)。它们不是可用于一般运行时错误(例如边界检查错误)的全局变量。
  • 很公平。我试图回答 OP 的具体问题,并为更一般的情况提供更多信息。如果您认为目前写的有误,请随时编辑我的答案。
  • 我已经尝试过与此相符的编辑。当然,请按您认为合适的方式回滚或调整。我不需要再评论了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2013-08-01
  • 2021-07-21
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多