2013-06-30 3 views
14

Я адаптирую код Fortran, который я не написал, и без большого опыта fortran. Я только что нашел ситуацию, когда некоторая некорректная входная информация молча игнорировалась и хотела бы изменить этот код, чтобы сделать что-то более подходящее. Если бы это было C, то я хотел бы сделать что-то вродеОстановить программу fortran с ненулевым статусом выхода

fprintf(stderr, "There was an error of kind foo"); 
exit(EXIT_FAILURE); 

Но в Fortran, лучшее, что я знаю, как это сделать выглядит

write(*,*) 'There was an error of kind foo' 
stop 

которой отсутствует выбор выходного потока (незначительная проблема) и статус выхода (основная проблема).

Как я могу завершить программу fortran с ненулевым статусом выхода?

В случае, если это зависит от компилятора, решение, которое работает с gfortran, было бы неплохо.

ответ

18

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

+0

В соответствии со стандартом: «Во время завершения код остановки, если таковой имеется, доступен в зависимости от процессора». – astrojuanlu

4

Я не нашел ничего о пользователе STOP в gfortran 4.7.0 keyword index, возможно, потому, что это ключевое слово на языке, а не внутреннее. Тем не менее, есть EXIT intrinsic, который, похоже, делает именно то, что я искал: выход с заданным статусом. И the fortran wiki имеет a small example of using stderr, который упоминает константу ERROR_UNIT. Итак, теперь мой код выглядит так:

USE ISO_FORTRAN_ENV, ONLY : ERROR_UNIT 
[…] 
WRITE(ERROR_UNIT,*) 'There as an error of kind foo' 
CALL EXIT(1) 

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

+2

СТОП - это заявление. EXIT() является расширением GNU и может быть недоступен в других компиляторах. –

10

В дополнение к остановки п, есть также ошибка остановки п так 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 
Смежные вопросы