已在另一个单元中打开的文件程序已中止。

时间:2016-10-12 02:14:59

标签: fortran openmp gfortran

这是我编写的用于测试多线程独立读取文件的程序:

gfortran -fopenmp -o exe a.f90

我是由gfortran编译器编译而没有收到任何错误:./exe,并运行./exe,但每次运行ifort -qopenmp -o exe a.f90时都会遇到不同的错误。但是,我也使用ifort编译它:./exe,并成功运行它At line 15 of file fortran_learning_book.f90 (unit = 102) Fortran runtime error: File already opened in another unit Program aborted. Backtrace: Program aborted. Backtrace: #0 0x10c30aff2 #0 0x10c30aff2 Program aborted.

gfortran在运行时出现的错误之一是

{
  "hello": "Hello, World!",
  "lang_msg": "This message is in English."
}

2 个答案:

答案 0 :(得分:2)

您的代码不是有效的标准Fortran,因此使用不同的编译器会显示未定义的行为。 Fortran标准非常明确:

  

如果某个文件已连接到某个单元,则该文件中具有不同单元的OPEN语句不会被执行。

(ISO / IEC 1539-1:2010第9.5.6.1节)

与其他语言不同,标准Fortran不允许多次打开同一个文件。

编辑:正如IanH所指出的那样,即将推出的Fortran标准(非正式名称为Fortran 2015)将正式删除限制,但仍会在实施时决定是否有多个连接到同一个文件允许与否。

GNU Fortran和英特尔Fortran都能够使用OpenMP扩展编译正确的 Fortran代码。

答案 1 :(得分:1)

我怀疑您的问题的根源是您没有向action语句提供任何open参数。实际上,在新打开的文件上允许(readwritereadwrite)的默认操作是实现定义的。因此,您可能会在例如readwrite模式下并行打开相同文件多次,特别是允许来自多个独立单元的write模式,从而导致潜在的文件不一致。然后编译器和/或运行时库可能会或可能不会检查这种(in)一致性并将其报告为错误...从它的外观看,gfrotran和ifort在至少一个中有不同的方法两部分(默认操作和/或RTL检查)。

唯一的例子是同一个文件的这种并行打开是“合法的”,如果你限制访问阅读模式,则是安全的。因此,将action='read'添加到open语句可能只会解决问题。实际上,它适用于gfortran版本5.4.0。

现在,我们处于灰色区域(至少对我来说),我真的不知道这一切是多么便携/符合标准。因此,尽管我认为这解决了您的直接问题,但我无法评论不同编译器之间代码的整体可移植性。