2013-06-30 19 views
14

私は書いていないFortranコードをいくつか改造しています。私はちょうどいくつかの不正な入力が黙って無視され、より適切な何かをするためにそのコードを変更したいという状況を発見しました。これがCだったら、私は終了ステータスが0以外のFortranプログラムを停止する

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

ような何かをしたい。しかし、FORTRANで、私が行う方法を知って最高の

出力ストリーム(小さな問題)の選択を欠い
write(*,*) 'There was an error of kind foo' 
stop 

のように見えます終了ステータス(重大な問題)。

終了ステータスが0以外のFortranプログラムを終了するにはどうすればよいですか?

これはコンパイラに依存する場合は、gfortranで動作する解決策がいいでしょう。

答えて

18

stopステートメントでは、整数値または文字値を使用できます。これはstderrが存在するときに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ではリンクしていない可能性があります。 停止Nに加え

+0

標準によると、 " 終了時点で、ストップコードがあれば、プロセッサに依存した方法で利用可能です。" – astrojuanlu

4

gfortran 4.7.0 keyword indexにはSTOPについて何も見つかりませんでした。おそらく、それは言語キーワードであり、組み込み関数ではないためです。それでも、EXIT intrinsicがあります。これは、私が探していたものを実行しているようです。特定のステータスで終了します。そして、the fortran wikiは、を記載するa small example of using stderrを有する。だから今私のコードは次のようになります:

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

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

+2

STOPは文です。 EXIT()はGNU拡張であり、他のコンパイラでは利用できない場合があります。 –

10

は、エラー停止NがWindowsでのgfortranでのFortran 2008 ためもあり、それらの両方は、後続echo %errorlevel%で見ることができるように、OSに対してエラー番号を送信します。ステートメントエラー停止にもエラーメッセージを渡すことができます。

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 
関連する問題