Остановить программу fortran с ненулевым статусом выхода
я адаптирую некоторый код Fortran, который я не написал, и без большого опыта fortran сам. Я просто нашел ситуацию, когда некоторые искаженные входные данные были молча проигнорированы, и хотел бы изменить этот код, чтобы сделать что-то более подходящее. Если бы это был C, то я бы сделал что-то вроде
fprintf(stderr, "There was an error of kind foo");
exit(EXIT_FAILURE);
но в fortran лучшее, что я знаю, как это сделать, выглядит как
write(*,*) 'There was an error of kind foo'
stop
которому не хватает выбора выходного потока (незначительная проблема) и состояние выхода (основных проблема.)
как я могу завершить программу fortran с ненулевым статусом выхода?
в случае, если это зависит от компилятора, решение, которое работает с gfortran, было бы неплохо.
3 ответов
на stop
оператор допускает целочисленное или символьное значение. Кажется вероятным, что они будут выводиться в stderr, когда он существует, но поскольку stderr зависит от ОС, маловероятно, что стандарт языка Fortran требует этого, если он вообще что-то говорит. Также вероятно, что при использовании числового параметра будет установлен статус выхода. Я попробовал это с gfortran на Mac, и это было так:
program TestStop
integer :: value
write (*, '( "Input integer: " )', advance="no")
read (*, *) value
if ( value > 0 ) then
stop 0
else
stop 9
end if
end program TestStop
, а именно stop
с целым числом или строкой будет ли это зависеть от ОС, оператор является частью языка и всегда будет компилироваться. call exit
является расширением GNU и может не ссылаться на некоторые ОС.
кроме стоп n, есть еще ошибка stop n С Fortran 2008.
С gfortran под Windows они оба отправляют номер ошибки в ОС, как видно из последующего echo %errorlevel%
. Заявление Stop-ошибки также может быть передано сообщение об ошибке.
program bye
read *, n
select case (n)
case (1); stop 10
case (2); error stop 20
case (3); error stop "Something went wrong"
case (4); error stop 2147483647
end select
end program
Я ничего не мог найти о STOP
на индекс ключевых слов gfortran 4.7.0, вероятно, потому, что это ключевое слово языка, а не внутренней. Тем не менее, есть выход характеристической который, кажется, делает именно то, что я искал: выход с заданным статусом. И fortran wiki и небольшой пример использования stderr который упоминает константу ERROR_UNIT
. Итак, теперь мой код выглядит так:
USE ISO_FORTRAN_ENV, ONLY : ERROR_UNIT
[…]
WRITE(ERROR_UNIT,*) 'There as an error of kind foo'
CALL EXIT(1)
об этом на крайней мере компилируется. Тестирование еще не завершено, но оно должно сработать. Если кто-то знает более элегантный или более подходящее решение, не стесняйтесь предлагать альтернативные ответы на этот вопрос.