我编写了一段代码,在 Arch Linux 上使用 GNU Fortran (GCC) 7.2.1 20171128 编译,尝试写入文件。该单元使用newunit=...
Fortran 2008 功能打开
尝试写入文件时,代码崩溃,引发错误Fortran runtime error: End of file
。
非工作代码
这是代码的最小非工作版本。如果文件不存在,代码会在 gfortran 7.2.1 中崩溃
program foo
implicit none
character(len=80) :: filename
character(len=5) :: nchar
integer :: ilun=1
call title(1, nchar)
! nchar = '00001'
filename = trim(nchar)//'.txt'
write(*, '(a, "<", a, ">")') 'filename ', trim(filename)
open(newunit=ilun, file=trim(filename), form='formatted', status='replace')
write(ilun, '(a1,a12,a10)') '#', 'Family', 'Count'
close(ilun)
end program foo
subroutine title(n, nchar)
implicit none
integer, intent(in) :: n
character(len=5), intent(out) :: nchar
write(nchar, '(i0.5)') n
end subroutine title
这是我正在使用的命令rm -f 00001.txt; gfortran foo.f90 -o a.out && ./a.out
。
工作代码
相比之下,以下代码在同一台机器上编译并完美运行
程序 foo
implicit none
character(len=80) :: filename
character(len=5) :: nchar
integer :: ilun=1
! call title(1, nchar)
nchar = '00001'
filename = trim(nchar)//'.txt'
write(*, '(a, "<", a, ">")') 'filename ', trim(filename)
open(newunit=ilun, file=trim(filename), form='formatted', status='replace')
write(ilun, '(a1,a12,a10)') '#', 'Family', 'Count'
close(ilun)
end program foo
这是我正在使用的命令rm -f 00001.txt; gfortran foo.f90 -o a.out && ./a.out
。
重要的提示
使用 ifort(在 ifort15 和 ifort18 之间尝试的任何版本)以及 GNU Fortran (GCC) 6.4.1 20171003 和 GNU Fortran (GCC) 7.2.0 编译时,这两个代码都运行良好,因此版本 7.2 中似乎引入了一个问题.1 的 gfortran 或与 Arch Linux 捆绑的版本。
几点评论
- 如果您
nchar = '00001'
在非工作示例中取消注释,它仍然不起作用。 - 如果您更改
newunit=ilun
为unit=ilun
, 例如ilun=10
之前,它在任何情况下都有效
系统详情
操作系统:GNU Linux 发行版:Arch Linux(截至 2017 年 12 月 15 日的最新版本)
$ uname -a
Linux manchot 4.14.4-1-ARCH #1 SMP PREEMPT Tue Dec 5 19:10:06 UTC 2017 x86_64 GNU/Linux
$ gfortran --version
GNU Fortran (GCC) 7.2.1 20171128
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.