• ベストアンサー

繰り返し計算中に定数が変わってしまいます

現在FORTRAN77を用いて繰り返し計算を行っています. ところが計算を繰り返しているうちに一定の値として与えているはずのものが勝手に別の値になってしまいます. 具体的に例をあげますと, a=1.00000 だったものがいきなり a=1.7532423E-16 とかになります. このaの値は繰り返しの度に何かから読み込んでいるものではなく,計算の最初に与えてしまい,最後まで変化しないはずのものです. ですので原因がわからず困っています. 何か原因がわかる方がいらっしゃいましたらアドバイスお願いいたします.

質問者が選んだベストアンサー

  • ベストアンサー
  • nineexit
  • ベストアンサー率100% (8/8)
回答No.4

ソースコードがないので、考えられる可能性を2つほどあげておきます。 1.サブルーチン内でaがローカル変数になっている。 サブルーチンにメインプログラムや外のサブルーチンからaという変数の値を持ってくる場合は、aを引数にするか、グローバル変数として扱うかどちらかが必要です。 それをしていなければ、aの値はそのサブルーチンローカルの変数となってしまいます 引数やグローバル変数(common,include,moduleなど)をチェックしてみてください。 2.配列外の参照になっている real b(2),a という変数を使っている場合に i=3 b(i)=10. とすると、b(3)は存在しないため、配列外参照になります。 配列外参照をすると、他の変数にアクセスすることになります。 例えば、配列外参照で上記のような代入演算を行うと、他の変数が書き代わってしまいます。 特にfortranの場合、subroutineの引数を誤ると配列外参照が起きやすいです。 subroutineの順序や配列の数が適当かチェックしてみてください。 まずは、 gdbを使うか、あるいは、 write(*,*) a をたくさん書いてどこでaの値が変わっているかチェックしてみてください。 なお、コンパイラによっては配列外参照を禁止するオプションが付いています。 例えば、gfortranの場合-fbounds-checkオプションがあります。

hnakata
質問者

お礼

ご回答ありがとうございます。 どうやら配列外を参照してしまっているようです。 実行時のエラーとして「配列をオーバーしてる」という内容のエラーでます。 配列外参照で全ての値がかわってしまうのですね。知りませんでした。 ありがとうございます、勉強になります。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

プログラムは、思った通りじゃなくて書かれたとおりに実行されます。 変数の値が変わったのなら、書き換えるようなプログラムを書いてしまっているということです。 ここにプログラムを書くか、あるいは自分で調べるなら、見直してもわからないのであれば、ひたすら write(*,*) a を入れまくって、どこで値が変わったのか調べる。

すると、全ての回答が全文表示されます。
  • equinox2
  • ベストアンサー率48% (321/660)
回答No.2

考えられる原因は (1)コードの実行中に'a'の値が、あなたにとって意図しない動き(ソースにとっては指示通り)  で書き換えられる。 (2)コンパイラのバグ 一般的には(1)のほうがはるかに可能性が高いので、誰が見てもソースに問題がなければ、  (2)を疑いましょう。

すると、全ての回答が全文表示されます。
noname#77845
noname#77845
回答No.1

これだけで、原因を探れと…。 そりゃ、無理でしょ。 せめて、その部分だけでもソースを示してもらわないとね。 神様や超能力者じゃないんだから。

すると、全ての回答が全文表示されます。

関連するQ&A