web-dev-qa-db-ja.com

終了ステータスがゼロ以外の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で機能するソリューションはNiceです。

18
MvG

stopステートメントでは、整数値または文字値を使用できます。これらが存在する場合、これらはstderrに出力される可能性がありますが、stderrはOSに依存するため、Fortran言語標準が何かを言っているとしてもそれを要求する可能性は低いです。数値オプションを使用すると、終了ステータスが設定される可能性もあります。 Macでgfortranを使って試してみましたが、その通りでした。

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の動作はOSに依存しますが、ステートメントは言語の一部であり、常にコンパイルされます。 call exitはGNU拡張機能であり、一部のOSではリンクされない場合があります。

20
M. S. B.

stop nに加えて、Fortran 2008以降はerror stop nもあります。Windowsでのgfortranでは、両方ともOSにエラー番号を送信します。後続の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
10
user1220978

gfortran 4.7.0キーワードインデックスSTOPについて何も見つかりませんでした。おそらく、これは言語キーワードであり、組み込みではないためです。それにもかかわらず、 EXIT組み込み があります。これは、私が探していたものを実行しているようです。特定のステータスで終了します。そして 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)

これは少なくともコンパイルします。テストはまだ保留中ですが、機能するはずです。誰かがよりエレガントまたはより適切な解決策を知っている場合は、この質問に対する代替の回答を自由に提供してください。

3
MvG