Я написал фрагмент кода, скомпилированный с помощью GNU Fortran (GCC) 7.2.1 20171128 на Arch Linux, который пытается записать в файл. Модуль открывается с помощью функции 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
.
Рабочий код
Для сравнения, следующий код отлично компилируется и работает на той же машине.
программа фу
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 (по состоянию на 15 декабря 2017 г.)
$ 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.
[doing some stuff]
. минимально воспроизводимый пример, который мы можем протестировать на нашем компьютере. Попробуйте избавиться от зависимостей модулей при создании MCVE. - person Vladimir F   schedule 14.12.2017