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