Остановить программу 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)

об этом на крайней мере компилируется. Тестирование еще не завершено, но оно должно сработать. Если кто-то знает более элегантный или более подходящее решение, не стесняйтесь предлагать альтернативные ответы на этот вопрос.