Ошибка выполнения Fortran: конец файла при записи

Я написал фрагмент кода, скомпилированный с помощью 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.

person cphyc    schedule 14.12.2017    source источник
comment
Пожалуйста, опубликуйте компилируемый пример без [doing some stuff]. минимально воспроизводимый пример, который мы можем протестировать на нашем компьютере. Попробуйте избавиться от зависимостей модулей при создании MCVE.   -  person Vladimir F    schedule 14.12.2017
comment
Проблема в том, что код, похоже, дает сбой по внешней причине, которую я пока не понимаю. Я добавил компилируемый (и рабочий) пример в свой пост.   -  person cphyc    schedule 14.12.2017
comment
У меня не происходит сбой. Однако структура такая же, как и та, которая дает сбой, поэтому это может быть проблема с компилятором.   -  person cphyc    schedule 14.12.2017
comment
Давайте продолжим обсуждение в чате.   -  person cphyc    schedule 15.12.2017
comment
TryItOnline также использует gfortran7 .2.1, но вроде работает... (возможно проблема в Arch?)   -  person roygvib    schedule 16.12.2017
comment
Я открыл проблему в системе отслеживания ошибок Arch Linux. См. bugs.archlinux.org/task/56768.   -  person cphyc    schedule 19.12.2017


Ответы (1)


Эта проблема связана с дистрибутивом Arch Linux Gfortran 7.2.1. Теперь это исправлено (см. https://bugs.archlinux.org/task/56768). ).

Если вы столкнулись с проблемой, вам следует обновить установку, используя

pacman -Syu gcc-fortran
person cphyc    schedule 08.01.2018