Остановить fortran-программу с ненулевым статусом выхода - программирование
Подтвердить что ты не робот

Остановить 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, будет приятным.

4b9b3361

Ответ 1

Оператор 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 и может не ссылаться на некоторые ОС.

Ответ 2

В дополнение к остановке n, также существует остановка ошибки n с Fortran 2008. С gfortran под Windows они оба отправляют номер ошибки в ОС, как можно видеть с последующим echo %errorlevel%. Ошибка остановки инструкции также может быть передана сообщение об ошибке.

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

Ответ 3

Я не мог найти ничего о STOP в gfortran 4.7.0 ключевое слово, возможно потому, что это ключевое слово языка, а не внутренняя. Тем не менее, существует EXIT intrinsic, который, кажется, делает именно то, что я искал: выход с заданным статусом. И 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)

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