
fortranについての質問です。
このFortranは、頭にそれぞれ14161~14163とつく33個のファイル(1/1~12/31,欠損地あり1年分)を読んでいき、例えば1/1、1/2…と365日分の33年の平均値を導くはずなのですが、下のようなエラーがでます。おそらく、14161が2008までないからではないかと思うのですが、現在勉強中なので、なにかアドバイス、おかしいところ修正できるところがありましたらお願いします。
program sapporo_kikouchi
INTEGER :: sum, no, point
INTEGER :: year, mon, day, data
INTEGER :: doy
REAL,dimension(365) :: temp, ndata
REAL :: lon, lat
CHARACTER*4 yyyy
CHARACTER*5 sssss
ndata(:)=0.0
temp(:)=0.0
do ispot=14161,14163
write(sssss,"(i5)") ispot
do iwork=1976, 2008
write(yyyy,"(i4.4)") iwork
open(50, file=''//sssss//'_temp'//yyyy//'.csv', status='old')
! write(6,*) ispot iwork
do i = 1,366
read(50,*,iostat=io) id,year,mon,day,lon,lat,data
if(io < 0) exit
if(mon==2 .AND. day==29) then
cycle
endif
call date2doy(year,mon,day,doy)
temp(doy) = temp(doy) + data/10.0
ndata(doy) = ndata(doy) + 1
end do
close(50)
enddo !!! end of year loop
enddo
do i=1,365
if( ndata(i) == 0 ) then
temp(i) = -99999.9
else
temp(i)=temp(i)/ndata(i)
endif
write(6,*) i, temp(i), ndata(i)
enddo
stop
end program
subroutine date2doy(iy,im,id,idoy)
INTEGER,dimension(12) :: nday
INTEGER :: uruu !!uruu=1: うるう年、uruu=0: 通常の年
uruu=0
DATA nday /31,28,31,30,31,30,31,31,30,31,30,31/
if(mod(iy,4)==0 .AND. mod(iy,100)/=0) then
uruu=1
endif
if(mod(iy,1000)==0) then
uruu=1
endif
!! うるう年も無視する
itotal = 0
if( im /= 1 )then
do m=1, im-1
itotal = itotal + nday(m)
enddo
endif
idoy = id + itotal
! write(6,*) iy,im,id, idoy
return
end
------------------------------------------------------------------------------
At line 18 of file kikouchi.f90 file: "14161_temp1993.csv"
Traceback: not available, compile with -ftrace=frame or -ftrace=full
Fortran runtime error: 指定されたファイルが見つかりません。
-------------------------------------------------------------------------------
No.3ベストアンサー
- 回答日時:
> 一度、iostat=ioをOPEN文に指定せずif (io < 0) cycleと書いたときは、同じようなエラーがでたのですが
それはそうでしょう。OPEN文を実行したときのステータスをどの変数に設定すればよいのか教えてもいないのに,ioという変数を見ても仕方がありません。
> if文のなか(io < 0)でも(io /= 0)でも回りました。あまり差はないんですかね?
正常に開けたときは0になって,そうでない場合は正の整数が返ります。負の値が返るのはあなたの使っているシステムの拡張機能ではないですか?なんにせよエラーの原因に興味がないときには0であるかどうかだけを判定すれば十分です。エラーの原因を知りたければ値がどうなっているかを調べます。
> ただ、今回回ったものの全て欠損値として出力されてしまっています。
本当にファイルの中身はあるのですか?また中身があったとしてもファイルは正常に読めているのですか?そういうことを確認すべきですね。デバッガを使うとか,
read(50,*,iostat=io) id,year,mon,day,lon,lat,data
の次の行に
print*,id,year,mon,day,lon,lat,data
とでも書いて確認してください。
ありがとうございました。
できました。違うチェックのためにファイルを一度違うファイルのなかに隠しておいたせいでした。
本当に助かりました。
また、おそらくFRTRANについて質問すると思いますが、もし見かえることがありましたら、ぜひご教授いただけるとうれしいです。
今回はありがとうございました。
No.2
- 回答日時:
うるう年であるのは以下の条件です。
if(mod(iy,4)==0) uruu=1
if(mod(iy,100)/=0) uruu=0
if(mod(iy,400)==0) uruu=1
もし1976年から2008年まで限定で良いのなら
if(mod(iy,4)==0) uruu=1
だけで済みます。
エラーメッセージとして14161_temp1993.csvがないといわれています。
欠損値を除いた平均値を導きたいということなら
open(50, file=''//sssss//'_temp'//yyyy//'.csv', status='old')
でエラーとなった時にスキップするよう
open(50, file=''//sssss//'_temp'//yyyy//'.csv', status='old', iostat=io)
if(io /= 0) cycle
とでもしておけばいいんじゃないかな。
ありがとうございました。
一度、iostat=ioをOPEN文に指定せず
if (io < 0) cycle
と書いたときは、同じようなエラーがでたのですが、今回回りました。
確かめたところ、指定しないとだめなんですね。
またif文のなか(io < 0)でも(io /= 0)でも回りました。あまり差はないんですかね?
ただ、今回回ったものの全て欠損値として出力されてしまっています。
1 -99999.9 0.
2 -99999.9 0.
:
365 -99999.9 0.
となっています。まだ修正しなければいけないところがあるようです。
なにかアドバイスあるでしょうか?
No.1
- 回答日時:
エラーの原因は分かっているようですが、どのように処理したいのでしょうか?
それからdate2doyでは閏年の判定らしきものをやっているが、その判定が間違っている上に、せっかくの判定を使っていないのはどうして?
ありがとうございます。
うるう年のところ間違っていますか?どこが違いますか?確かに今回は使用しません。が、今後違う視点で見る必要が出てくるので、書いときました。先頭に!つけます。
また、今回の最終的な目標は、上にも書きましたが、「1/1、1/2…と365日分の33年の平均値を導く」ということです。欠損値があるため、欠損値を除いた平均値を導きたいのです。
どういう処理というのはどういうことでしょうか?
画面に出力されるのは、1976~1992年までしか出力されず、
write(6,*) i, temp(i), ndata(i)
の部分が出力されていないんです。
このプログラムを作ったときは、14161_temp[1976-2008]が33個、ディレクトリにあった際は回ったはずなのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) vba GetAsyncKeyState関数について 1 2023/08/24 12:08
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
htaccess、404エラーページ...
-
xpを更新してからbookshelfがお...
-
webサイトにエラーがあるとどん...
-
リンク作成の質問
-
FF14のベンチマークが動きません
-
webカメラの明るさを変えようと...
-
頻繁にPCが再起動します
-
DVDドライブでエラー
-
fortranの実行について
-
movabletype4.22-jaでの投稿時...
-
fortranについての質問です。
-
EXCEL VBA 文字色を変える
-
ハードディスクの初期化
-
SonicStageについて(SONYのWal...
-
W3CのCSS検証エラーについて
-
SpywareBlaster3.3のDatabaseError
-
なぜかブルースクリーンに…
-
Office Component Suite
-
FFFTPで更新中にエラー
-
【Win32Api】 ERROR_BAD_UNIT ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでFormat がうまく使えない
-
Web.Config 構成ファイルのエラー
-
シェルスクリプトの実行エラー...
-
ホームページビルダーの”全体の...
-
Debug Assertion Failed?
-
NET USE コマンドでエ...
-
不明なソフトウェア例外(0xe06...
-
C# HttpWebRequestのエラーにつ...
-
VBAで印刷するとエラーになって...
-
W3CのCSS検証エラーについて
-
Excel ファイルに保存すると実...
-
bcpadがうまく実行できないので...
-
LTspiceのTime Stepエラーについて
-
実行時エラー'1004': アプリケ...
-
FileUploadを利用しての画像保存
-
ホームページ転送中に「アクセ...
-
Access ADOで文字列を日付型へi...
-
aspxをサーバーで表示すること...
-
vbaでファイルを開くパス名に変...
-
POV-Ray についての質問です!
おすすめ情報