爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5924|回复: 14

[求助] 循环读写计算多个文件出错,希望大神能帮帮忙,在线等待回复

[复制链接]
发表于 2018-1-31 16:30:29 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
各位大侠我的原始数据是这样的,是多年秋季月资料,排放顺序是站号,年、月,后面分别是浮尘,扬沙,沙尘暴和大风日数

数据格式

数据格式

由于多个文件,而且命名都是比较有规律的,而且每个站点的时间长度都是同一的,我已进行筛选和排查如图2
3.png
我想利用循环计算每个站点,单独计算每年的季节资料,文中的缺测值是999999.00
以下是我的程序和错误提示(是不是代码这样彩色的更清楚,一起放了)
1.png 2.png
这个循环只能执行第一个循环,后面就不执行了,错误提示貌似说循环出问题,但看了半天我的程序,我自己实在没看出来
希望高手能帮我看看
这个是程序代码
!此程序用于读取file_list.txt下的所有txt文件,计算每年的秋季平均并批量生成新的数据
program tiqu_shuju
implicit none
integer i,j,k
integer,parameter::n=165   !总时间
integer,parameter::m=19    !txt文件数量
character(len=20),dimension(m)::file_n
!character(len=20),dimension(19)::file_n2
real::sum1,sum2,sum3,sum4


!定义派生类数据
type station
!character*8 id
integer id,yy,mm
real fc,ys,sc,df !分别对应资料中的年月日,浮尘,扬沙,沙尘暴,大风日数
end type
type(station),dimension (n)::sta  

!打开已生成的filename文件
  open(11,file='file_list.txt',form='formatted')
  !open(18,file='file_list2.txt',form='formatted')
   do i=1,m
           read(11,'(a)') file_n(i)
         !  read(18,'(a)')file_n2(i)
           write(*,*)  file_n(i)    !检查是否有错误
        enddo
close(11)

do i=1,m
open(12,file=''//trim(file_n(i))//'',form='formatted')
open(16,file='n'//trim(file_n(i))//'',form='formatted')
!open(14,file='autumn_end.txt',form='formatted')  

                 do j=1,n
                     read(12,*) sta(j)
                         ! write(*,*) j,i
                        ! print*, sta(j).fc
                end do

               do j=1,n
                  ! print*, sta(j)
                  sum1=0.0
                  sum2=0.0
                  sum3=0.0
                  sum4=0.0
                     if(sta(j).yy==sta(j+1).yy.and.sta(j+1).yy==sta(j+2).yy)then
                              if(sta(j).fc==999999.or.sta(j+1).fc==999999.or.sta(j+2).fc==999999)then
                                     sum1=999.0
                                                 sum2=999.0
                                                 sum3=999.0
                                                 sum4=999.0
                                        else
                           sum1=sta(j).fc+sta(j+1).fc+sta(j+2).fc
                                       sum2=sta(j).ys+sta(j+1).ys+sta(j+2).ys
                                       sum3=sta(j).sc+sta(j+1).sc+sta(j+2).sc
                                       sum4=sta(j).df+sta(j+1).df+sta(j+2).df
                    end if
                write(16,'(2i7,4f10.2)')sta(j).id,sta(j).yy,sum1,sum2,sum3,sum4
                end if
                      end do
                   close(16)

close(12)
end do


end


密码修改失败请联系微信:mofangbao
发表于 2018-2-4 17:54:41 | 显示全部楼层
楼主这个错误有点马虎啊,你要站在电脑的角度去思考程序是怎么运行的
这个是一个很常见的数组越界的错误

【问题分析】
一、首先看声明变量和数组的语句
type(station),dimension (n)::sta
定义了数组sta,其数组上界是165,也就是总时间n的大小

二、看程序具体调用时,数组标号怎么运行的,问题就出在这
do j=1,n  【让j从1到n,步长1自加】
if(sta(j).yy==sta(j+1).yy.and.sta(j+1).yy==sta(j+2).yy)then
....(余下代码略)

当j运行到n-1(j=164)的时候,这个if语句调用的数组sta就开始有问题了
第一个sta是sta(164),好的可以
第二、第三个sta是sta(165),没问题,正好是这个数组的最后一个数
第四个sta问题就来了,这个时候,程序内部的j是164,而j+2是166,这个就越界了

具体怎么改楼主自己练习一下吧

点评

刚好需要: 5.0 谢谢共享: 5.0
刚好需要: 5 谢谢共享: 5
问题解决了~~~谢谢  发表于 2018-2-5 10:13

评分

参与人数 1金钱 +10 收起 理由
lqouc + 10

查看全部评分

密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2018-1-31 19:36:51 | 显示全部楼层
大神啊~~~快来救救我呀,各位大神走过路过瞧一眼
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-2-1 10:51:10 | 显示全部楼层
没人帮忙看一下吗?求助啊,求助~~~~
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-2-1 11:54:40 | 显示全部楼层

我不是分享啊,这个可以单站出图,不能循环出图,有问题的程序
密码修改失败请联系微信:mofangbao
发表于 2018-2-1 17:59:24 | 显示全部楼层
Fortran新手,不太明白close(11)以后,前面的数组file_n(i)还可以用吗~~  
密码修改失败请联系微信:mofangbao
发表于 2018-2-1 19:40:54 | 显示全部楼层
Fortran新手感觉这个定义数组的方式好好用呀~~~学习了
type(station),dimension (n)::sta
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-2-2 13:33:08 | 显示全部楼层
乌兰兰111 发表于 2018-2-1 17:59
Fortran新手,不太明白close(11)以后,前面的数组file_n(i)还可以用吗~~

可以啊,关闭以后,最外围的循环再打开一个文件
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-2-2 13:34:43 | 显示全部楼层
乌兰兰111 发表于 2018-2-1 19:40
Fortran新手感觉这个定义数组的方式好好用呀~~~学习了
type(station),dimension (n)::sta

恩,这个自定义比较实用,我喜欢用自定义,数组也可以,但我觉得这个更方便,更一目了然
密码修改失败请联系微信:mofangbao
发表于 2018-2-2 17:47:34 | 显示全部楼层
本帖最后由 乌兰兰111 于 2018-2-2 17:48 编辑
nunu18 发表于 2018-2-2 13:33
可以啊,关闭以后,最外围的循环再打开一个文件

哦,这样呀,一直不太明白这个~~  自己看书的时候书上说的动态数组可能和这个混了,嘻嘻,谢谢你的回复
不过我还是很好奇,我仔细看了你写的代码,感觉哪里写的都对,我也挺好奇到底哪里错了的,如果你弄明白了可以告诉我吗~~
密码修改失败请联系微信:mofangbao
发表于 2018-2-2 17:47:47 | 显示全部楼层
nunu18 发表于 2018-2-2 13:33
可以啊,关闭以后,最外围的循环再打开一个文件

哦,这样呀,一直不太明白这个~~  自己看书的时候书上说的动态数组可能和这个混了,嘻嘻,谢谢你的回复
不过我还是很好奇,我仔细看了你写的代码,感觉哪里写的都对,我也挺好奇到底哪里错了的,如果你弄明白了可以告诉我妈~~
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表