Попытка прочитать неправильное значение в переменную изменит ее значение?

Если присутствует ключевое слово iostat, программа не останавливается при возникновении ошибки ввода-вывода. Затем, если я попытаюсь считать недопустимое значение в скалярную переменную, i скажем, останется ли эта переменная неизменной? Кажется, работает следующее:

program test
   integer :: i, stat

   i = 1

   do
      write (*, "('i = ')", advance='no')
      read (*, *, iostat=stat) i

      if (stat .eq. 0) then
         write (*, "('Valid integer. i has been set to ', I0)") i
      else
         write (*, "('Bad integer. i is still ', I0)") i
      end if
   end do
end program test

Могу ли я положиться на это поведение в Fortran 2003?


person Jan Berges    schedule 11.02.2015    source источник


Ответы (1)


Нет, значение переменной после неудачного чтения не определено.

Фортран 2008, 9.11.2

Если во время выполнения оператора ввода/вывода, содержащего либо спецификатор ERR=, либо спецификатор IOSTAT=, возникает состояние ошибки, тогда:

...

если оператор является оператором READ или возникает ошибка в операции ожидания для передачи, инициированной оператором READ, все входные элементы или групповые объекты списка имен в операторе, инициировавшем передачу, становятся неопределенными;

person Vladimir F    schedule 11.02.2015
comment
Только ли из-за поведения определенного компилятора (в моем случае gfortran) приведенный выше код работает, а не из-за стандарта (там я ничего не нашел)? - person Jan Berges; 11.02.2015
comment
Да, но это может привести к сбою в других обстоятельствах даже с тем же компилятором. Прочитайте весь раздел 9.11 в стандарте F2008. - person Vladimir F; 11.02.2015
comment
Теперь я также нашел это в Fortran 2003, 9.10.1. Спасибо! - person Jan Berges; 11.02.2015