Переносимая интерпретация кодов ошибок IOSTAT в заявлении Fortran OPEN? - PullRequest
1 голос
/ 06 мая 2020

Оператор fortran OPEN помещает системно-зависимый код ошибки в целое число, указанное в качестве необязательного спецификатора IOSTAT. Для Intel Fortran я нашел документацию по кодам ошибок на software.intel.com . Начиная с этого, я мог бы написать функцию / подпрограмму, которая преобразует значения iostat в значения, удобочитаемые человеком. Intel также предоставляет файл for_iosdef.for, который определяет имена символов c для значений.

В принципе, я мог бы повторить то же самое для всех поддерживаемых компиляторов, но есть ли какой-нибудь переносимый способ интерпретации кодов или, по крайней мере, их подмножества? Кроме того, для gfortran, похоже, нет официального списка, только неофициальные списки, такие как hep.manchester.a c .uk .

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Если вы хотите сохранить его переносимостью, придерживайтесь того, что говорит стандарт: Финальный проект Fortran 2008 стр. 242 Раздел 9.11.5 «IOSTAT = спецификатор»:

Вкратце, IOSTAT - это «зависит от процессора». Однако есть несколько определенных значений, которые указаны в ISO_FORTRAN_ENV:

  • IOSTAT_EOR (конец записи) ... отрицательное целое число
  • IOSTAT_END (конец файла) ... отрицательное целое число
  • IOSTAT_INQUIRE_INTERNAL_UNIT (запрос внутреннего файла) ... положительное целое число
  • 0 ни ошибки, ни EOF, ни EOR не произошло

Все остальные ошибки являются целыми положительными числами, отличными от IOSTAT_INQUIRE_INTERNAL_UNIT. Однако их стоимость не указывается.

Некоторые свойства могут быть запрошены с помощью оператора INQUIRE, например: разрешено ли вам читать или писать в файл.

3 голосов
/ 06 мая 2020

Начиная с Fortran 2003, доступен спецификатор IOMSG, который позволяет получать удобочитаемые сообщения об ошибках.

К сожалению, нет надежного способа получить полное сообщение об ошибке, поскольку для этого требуется одно CHARACTER(LEN=...) аргумент и заполняет его таким количеством символов, которое может содержать переменная, который может включать полный путь к файлу. В моем реальном сценарии использования мне пришлось использовать как минимум переменную CHARACTER(LEN=256).

Это также не позволяет надежно реагировать на определенные условия ошибки c во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...