- 締切済み
FORTRANについて
混乱しています。 ---------------前略----------------------------------- dailyP=0 do kk=1,24 dailyP = dailyP + idata(kk) enddo dailyP = dailyP/10 write(99,*) iyear, ',', mon, ',', iday, ',', dailyP --------------------------後略----------------------------- としているのですが、dailyP/10の値はでていると思うのですが、write文で最後にdailyP/24と書いたり、average=dailyP/24と前述で定義し、write文にaverageを記載しても、すごい値がでます。なぜなんでしょうか?dailyP/10の値もまちがっているのではないかと不安です。前略の文が関係している可能性があれば、その旨を教えてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
えぇと.... 小出しにされても混乱するだけなので, 「そのような問題が発生する」なるべく小さな*完全な*プログラムを一度出してもらえませんかね. ついでにデータも出してもらえるとうれしい.
- --HV--
- ベストアンサー率25% (5/20)
No2ですが、やはりわかりません。 24データしかないなら、全て書き出して、手計算と一緒になるかどうかを確認したほうがいいのでは? 500を超えてたら、500引いているだけなので、仮にidataに1000000が入っていたら、500引いてもあまり影響なく、すごい数値?になってしまいますよね。 そもそも、idataの値に対して、すごい数値というのがどれほどのものか、という情報もあったほうがよいかと思います。 プログラミング的な話でいくなら、 実数=実数+整数 という演算をしているようなので、 dailyP = daily + real(idata(kk)) ※倍精度なら、dble(idata(kk)) のようにしておいたほうがいいと思います。ある程度はコンパイラが自動でやってくれるとは思いますが。
- kusa_mochi
- ベストアンサー率76% (1597/2087)
多分変数 dailyPの値が、 ・dailyP/10の時点では正常で壊れていない ・dailyP/24の時点では破壊されて壊れている のではないかと思う。 Fortranの場合ポインタ型変数のようなものは無かったと思うので、配列の中に値をセットする際に添え字に配列範囲外を指定して壊しているのではと思う。 対応として ・配列内に値をセットしている部分で、添え字に変な値が入っていないかプログラムを頭の中でシュミレートしてみる ・コンパイルオプションで添え字の範囲チェックを行う様なオプションを有効にしてみる (お使いの処理系でそれがあるか保障できませんが、システム担当者に尋ねてみてください) ・プログラム中にデバック用のwrite分をこれでもかというくらい追加して、どこでdailyPがおかしくなっているのか確認してみる (おかしくなっている直前に変数の値を壊している配列への代入文がある筈) を行ってみては。
- --HV--
- ベストアンサー率25% (5/20)
具体的に値の指定しているところがdailyPの初期化だけなのでこれで判断できる人は誰もいないと思います。 do kk = 1, 24 print *, idata(kk) enddo の結果も貼り付けてみたらいかがでしょうか?
- DIooggooID
- ベストアンサー率27% (1730/6405)
この fortran の仕様が分かりませんが、 dailyP は 実数ですが、 10 や 20 は 整数だと思われます。 正しくは、型を合わせて 演算する必要があると思います。
お礼
ありがとうございました。もう一方の質問に、もう少し詳しいプログラムを載せましたので、よければみてアドバイスいただけるとありがたいです。
お礼
ありがとうございました。 --------------前略-------------------------- do mon=1,12 write(filename,"('tem' , i4.4, '.' , i2.2)") iyear, mon open(11, file=filename, status='old') do nn=1, 41 read(11,"(i2)", iostat=io) iday if(io < 0) exit if( 1 <= iday .AND. iday <= 31 ) then backspace(11) read(11,"(2x, 4(1x,6i3))") (idata(ihr),ihr=1,24) where (idata == 999) idata = 0 where (idata > 500) idata = 500 - idata ------------------------------------------------------- これが上にdo kk=1,24の上の部分で、この上の前略文はほぼ宣言文です。dailyPは実数です。ただ実数、整数の可能性はあると思って試したのですが、上手くいきませんでした。10で割ると、値がでて、それを24で割るとなぜ値が、すごいことになるんでしょうか??