尝试读取名称列表后返回的状态不是预期的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试读取名称列表后返回的状态不是预期的相关的知识,希望对你有一定的参考价值。

我想从文件中读取名单,但在名称列表不存在的情况下实现catch选项。根据我在here中读到的内容,我希望状态为84或85.我的代码看起来像这样:

mystat = 0
read( unit = file_unit, nml = lionml, iostat = mystat )

print*, mystat

if ( (mystat == 84) .or. (mystat == 85) ) then
!  (no namelist found? Go on, no big deal...)
else
!  (other stat problems? This may be problematic...)
end if

然而,这种情况并非如此。正在读取的文件没有名称列表lionml,但read指令返回的状态是-1(EOF)而不是84/85。

我是否从引用的来源中解释了错误的内容?我不明白在哪个其他情况下我会得到84/85的统计...

答案

您处于所谓的处理器/编译器相关行为领域。 Fortran的某些方面在某些约束条件下,标准并未完全指定有效程序的结果。

在这里,我们有(Fortran 2008,9.11.5):

执行包含IOSTAT =说明符的输入/输出语句会导致IOSTAT =说明符中的scalar-int-variable被定义为

  • 如果既不出现错误条件,文件结束条件也不出现记录结束条件,则为零值,
  • 如果INQUIRE语句中的单元号标识内部文件,则来自内部模块ISO_FORTRAN_ENV(13.8.2)的常量IOSTAT_INQUIRE_INTERNAL_UNIT的依赖于处理器的正整数值,
  • 依赖于处理器的正整数值,如果发生任何其他错误情况,则不同于IOSTAT_INQUIRE_INTERNAL_UNIT,
  • 如果发生文件结束条件且没有发生错误情况,则处理器相关的常量IOSTAT_END(13.8.2.13)的负整数值,或者
  • 如果发生记录结束条件且没有出现错误条件或文件结束条件,则常量IOSTAT_EOR(13.8.2.14)的依赖于处理器的负整数值。

您引用的文档特定于IBM(甚至该版本)的实现,并且(不一定)适用于您使用的编译器。因此,IBM可能会选择在给定错误条件下使用84,其中NAG或英特尔(等)可能会选择另一个。

此外,Fortran标准没有规定什么算作“错误条件”。从标准(F2008,9.11.1)

输入/输出错误条件集取决于处理器

虽然定义了所谓的记录结束和文件结束条件(不是错误)。缺少名称列表的名单列表输入文件是否被当前标准指定为错误(以及哪个错误)。

另请注意,当文件结束条件发生时,来自问题程序的mystat的值不一定是-1。如上所述,来自内在模块IOSTAT_END的负值ISO_FORTRAN_ENV可以便携地(对于F2008编译器)在这种情况下用于比较。

以上是关于尝试读取名称列表后返回的状态不是预期的的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Retrofit & Gson 返回 LinkedTreeMap 列表而不是我预期的类型?

根据字符串名称而不是列表视图项位置替换片段并启动活动

如何保存具有列表视图的片段状态

Android,从其他片段返回的空列表视图

方向/配置更改后如何维护 ListView 片段状态?

使用导航架构组件添加(而不是替换)片段