Как вызвать ошибку времени выполнения, когда переменная списка имен отсутствует во входном файле списка имен? - PullRequest
0 голосов
/ 21 ноября 2018

Пример кода выглядит следующим образом:

program main
 implicit none
 integer :: ufile
 real :: a, b, c
 namelist /my_nlt/ a, b, c
 open(newunit=ufile,file='my_nlt.txt')
 read(ufile,my_nlt)
 close(ufile)
 write(*,my_nlt)
end program main

И входной файл my_nlt.txt содержит:

 &my_nlt
 a=1.0
 b=2.0
  /

Здесь переменная c отсутствует во входном файле.Выполнение кода, скомпилированного с помощью gfortran, не выдает предупреждения / ошибки.Мне интересно, есть ли опция компилятора, которая может быть использована, чтобы вызвать ошибку / предупреждение при возникновении этой ситуации?

1 Ответ

0 голосов
/ 22 ноября 2018

Мне неизвестна такая опция для gfortran (или любого другого компилятора Fortran).Я также настоятельно рекомендую не полагаться на такую ​​опцию, если она будет найдена.

Существует форматирование списка имен, обеспечивающее некоторую простоту и гибкость ввода для конкретных объектов.Желая получить предупреждение с использованием списка имен, который не обновляет все переменные, возможно, пытается использовать инструмент ненадлежащим образом.

Для программы и ввода вопроса ожидаемое поведение во время выполнения для a и b должно бытьопределяется с указанными значениями, а для c не определено.Вместо этого мы могли бы определить три переменные со значением до чтения и посмотреть, будут ли они обновлены чтением:

real, parameter :: SENTINEL=HUGE(0.)
real :: a=SENTINEL, b=SENTINEL, c=SENTINEL
namelist /my_nlt/ a, b, c
open(newunit=ufile,file='my_nlt.txt')
read(ufile,my_nlt)

if (a==SENTINEL.or.b==SENTINEL.or.c==SENTINEL) ERROR STOP

Здесь SENTINEL будет значением, нежелательным для переменных или неожиданным ввход.Переменная, не включенная в запись списка имен, сохраняет свое значение до чтения.

Это не то же самое, что, конечно, не появляется (особенно, если нет входного значения вне диапазона), но еслиВы хотите проверить это, тогда вам придется анализировать входной файл вручную.Структура такого файла списка имен хорошо определена.

В качестве заключительного замечания, является ли переменная c "присутствующей" в следующей входной записи списка имен?

&my_nlt a=1., b=2., c=1* /
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...