2016-12-20 4 views
0

私は、入力として数値(x)を必要とし、出力として数値(y)を得るFortran95/03で関数を計算する簡単なプログラムを書こうとしています。 ユーザ入力はreal :: inputで、read呼び出しがユーザー入力が変数に収まるかどうかを確認するにはどうすればよいですか?

read (*,*, iostat=stat) input 
if(stat > 0) then 
    print *, "False input, use numbers!" 

のように見えるのiostatは、入力が数字または文字だったかどうかを確認するために私を助けます。

私の問題は、1000000000000のように非常に大きな数値を入力すると、プログラムがエラーメッセージ "bufferoverflow"でクラッシュすることです。私は4バイトの変数より大きい実数を作ることができることを知っていますが、入力数を大きくすることもできますので、問題は解決しません。

主な質問は、ユーザー入力のためにプログラムがクラッシュするのを防ぐことができますか?

+0

あなたは 'iostat ='が与えられてもプログラムが終了すると言っていますか?次のことはその質問への答えではありませんが、あなたは入力が '15000000000000000000000 ... 0'というのではなく、' 1.5e903'という形で与えることはできませんか? – francescalus

答えて

1

ユーザーの入力値を確認することは、著者以外の誰かとやりとりするすべての種類のソフトウェアで使用する必要がある非常に基本的な手法です。これはすべてのプログラミング言語で使用されます。あなただけの単純な条件

if (input > input_max) then 
    print *, "Input value too large, try again" 
    cycle ! or return stop or set some flag or whatever 
end if 

を使用することができます

値も小さすぎる可能性がありますことを忘れないでください!

クラッシュはどこから発生するのかを理解することが重要です。確かに大きな数字を入力するだけではなく、数値が大きすぎる配列を割り当てるなど、数値を悪い方法で使用したり、浮動小数点例外を発生させる計算をしたりすることはありません。

1

入力を文字列として読み取り、文字列入力を検証し、内部読み取りを使用して検証済み文字列をREALに変換します。

入力と出力にプロセッサに依存する動作の多くの側面があります。一般的な原則として、堅牢性が必要な場合は、自分で多くの作業を自分で行う必要があります。例えば、実数に対する誤った入力が与えられた場合、プロセッサがエラー状態としてそれを識別し、非ゼロのIOSTATコードを返す必要はない。

リストの入力は、あなたとあなたのユーザーを動かすかもしれない多くの驚くべき機能を持っているという点で、さらなる課題があります。

関連する問題