Изменение стандартного выхода в Gfortran - PullRequest
0 голосов
/ 11 января 2019

Установив export GFORTRAN_STDOUT_UNIT=777 Я хочу изменить свой стандартный вывод в gfortran. Если я запускаю программу

    program main
       implicit none

       write (*,*) "*"
       write (6,*) "6"
       write (777,*) "777"
    end program main

будет выводиться

> $ ./a.out                                                                                           
 777

и создайте файл:

> $ cat fort.6                                                                                        
 *
 6

Почему * больше не перенаправляется на стандартный вывод (теперь 777)? Это ошибка Gfortran или предполагаемое поведение?

1 Ответ

0 голосов
/ 11 января 2019

Я считаю, что поведение соответствует ожиданиям. Здесь интересны следующие абзацы:

GFORTRAN_STDOUT_UNIT: номер блока для стандартного выхода
Эту переменную среды можно использовать для выбора номера устройства , предварительно подключенного к стандартному выходу . Это должно быть положительное целое число. Значение по умолчанию - 6.
источник: Документация GCC Gfortran

Так что это просто означает, что /dev/stdout будет подключен к номеру устройства GFORTRAN_STDOUT_UNIT.

Стандарт Фортрана делает следующие заявления:

9,5 Файл подключения
9.5.1 Ссылка на файл
4 В операторе WRITE io-модуль, который является звездочкой, идентифицирует внешний модуль, который предварительно подключен для последовательного форматированного вывода. Это устройство также определяется значением именованной постоянной OUTPUT_UNIT встроенного модуля ISO_FORTRAN_ENV.

Примечание 9.15: Даже если OUTPUT_UNIT подключено к отдельному файлу на каждом изображении, ожидается, что процессор сможет объединить последовательности записей из этих файлов в одна последовательность записей, которая отправляется на физическое устройство, связанное с этим устройством, , например терминал пользователя .

источник: Стандарт Fortran 2008

Все, что мы знаем, это то, что (ergo OUTPUT_UNIT) предварительно подключены к устройству для последовательного форматированного вывода. Стандарт не устанавливает, что это за внешний блок. Нет ссылки на /dev/stdout. Стандарт фактически прямо упоминает в примечании, что пользовательский терминал - это возможный предварительно подключенный модуль, он также мог быть вашим принтером.

В итоге, установив GFORTRAN_STDOUT_UNIT=777, вы просто предварительно подключите модуль 777 к /dev/stdout, и будет предварительно подключен к внешнему модулю для последовательного выхода (т. Е. В данном случае fort.6)

...