電子書籍の厳選無料作品が豊富!

fortranの配列で範囲を超えた参照を行なってしまった場合、私が使っているコンパイラは何も警告とかエラーを発しません。たとえば、以下のようなものです。
real a(100)
write(*,*) a(0)
write(*,*) a(0)
stop
end
ここで、配列aは1~100までであり、0番は不定なので、何の値が返されても文句なし、ということなのかとは思います。(C言語では0~99ですかね。)
私の希望はコンパイラによるエラー検出なのですが、それができません。粛々と実行し妙な値を返します。また、その値は実行中に変化したりするようです(それも不定だから文句言えないのですが。)
私が仕様しているのはintel visual fortran ver.2.11です。コンパイラオプションで対処できるでしょうか。よろしくお願いします。

A 回答 (2件)

intel fortran の、配列はみ出し検出のコンパイラのオプションは /check:bounds です。


コンパイラのオプションは /help で表示されるので、それを見るのが良いと思います。
詳しくはマニュアルを読めば書いてあります。
なお intel visual fortran には ver.2.11 は存在しません。よくご確認ください。

普通Fortranでは、計算スピードが遅くなるので、実行時に配列はみ出しチェックなどはしません。デバッグ時にのみ使用します。また50年前くらいの整合配列がなかったころの古いプログラムでは、配列はみ出し前提のサブルーチンなどが使用されるので、はみ出しチェックは余計なお世話という場合もあります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。verは2.11ではなく、11.2でした。タイプミスですみません。Fortranの学習と処理系の学習の両方が必要だということがわかりました。また、とにかく早く早く計算するため、読めて使えるものがプログラマにとって有用かどうかなどチェックしないということもわかりました。
処理系(コンパイラ)のマニュアルはすべて目を通すか、必要なときだけ参照するかという問題はあるかと思いますが。マニュアルを全部読み込んだ頃、次のバージョンが出そうですけれども。

お礼日時:2015/08/23 16:21

○ 添字に変数等が使われている場合、実行するまでどんな値になるか判明しない


○定数を使う場合でも、下限値の設定が可能なので、 「0以下は警告」と言った単純な判定はできない。

と、通常のコンパイルでの解析よりも踏み込んだ解析が必要であり、判断が困難(あるいは不可能)です。


当該Fortranは使ったことが無いのですが、とりあえずは「警告レベルを最高段階にする」ことでも警告等が出ないようなら、無理だと考えてよいでしょう
    • good
    • 0
この回答へのお礼

回答有難うございます。昔は配列破壊とか言って、計算のシステムがおかしくなるから計算自体が止まるのかと思っていました。システムがおかしくなるのではなく、引いてきた値がおかしいから計算結果が爆発してしまうと理解しました。やってみなければ分からない(たまたま思ったように動作してしまったりする)ということがわかりました。

お礼日時:2015/08/23 16:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!