Fortran Coder

标题: 派生结构读取数据问题 [打印本页]

作者: 好好干    时间: 2017-2-19 11:35
标题: 派生结构读取数据问题
大家好!我有个关于派生结构读取数据的问题,想请教一下。
现在我有一个别人写好的程序,利用派生结构读取数据,但是我在自己IVF(Windows)下调试时,IVF就卡住自动重启了,主要的代码如下:
[Fortran] 纯文本查看 复制代码
TYPE type_rad_FY3
        INTEGER :: yyyy,mn,dd,hh,mm,ss
        INTEGER :: iscanline,iscanpos
        REAL*4  :: rlat,rlon !lat/lon in degrees for Anfovs
        INTEGER :: isurf_height, isurf_type !height/type for Anfovs
        REAL*4  :: satzen,satazi,solzen,solazi !scan angles for Anfovs
        REAL*4  :: tbb(20) !bright temperatures
!       REAL*4  :: btemps(20)
        INTEGER :: iavhrr(13),ihirsflag
        INTEGER :: iprepro(5) ! values from pre-processing
        REAL*4  :: clfra ! Cloud cover (<1.0)
        REAL*4  :: ts ! Skin temperature
        REAL*4  :: tctop ! Cloud top temperature
END TYPE type_rad_FY3

do iscan=1,nscan
   
         ! 1.0     Read fy3 data
         read(lnbufr,end=1000) rad !//此句
         num_tovs_file = num_tovs_file + 1
         ! 2.0     Extract observation location and other required information
         !     QC1:  judge if data is in the domain, read next record if not
         !------------------------------------------------------------------------
         ! rlat = bfr1bhdr(bufr_lat)
         ! rlon = bfr1bhdr(bufr_lat)
         ! if (rlon < 0.0) rlon = rlon+360.0
         info%lon=rad%rlon
         info%lat=rad%rlat
!         call da_llxy(info,loc,outsside,outside_all)
         if (outside_all) cycle
         
         ifov=rad%iscanpos
         year=rad%yyyy
         month=rad%mm
         day=rad%dd
         hour=rad%hh
         minute=rad%mm
         second=rad%ss
......


程序在运行到红色read语句就重启了。我查看的参考书对于派生结构的读取时rad%yyyy,但是他的程序用到了DO循环,按道理type定义应该是数组才对,利用rad(i)%yyyy来读取,我是这么理解。
所以我就不到程序的原作者为什么这么写?详细的程序在附件里(出错语句在243行)。谢谢大家!

Console1.f90

20.69 KB, 下载次数: 2

程序代码


作者: li913    时间: 2017-2-19 11:54
1、vs停止工作,可能是软件本身的原因。
2、没有输入文件,别人无法调试。
3、可以看看这个 http://fcode.cn/guide-62-1.html
4、给出错误提示。



作者: 百事可乐    时间: 2017-2-19 15:13
代码都通不过编译,楼主是怎么调试的?
作者: 好好干    时间: 2017-2-19 16:58
li913 发表于 2017-2-19 11:54
1、vs停止工作,可能是软件本身的原因。
2、没有输入文件,别人无法调试。
3、可以看看这个 http://fcode.c ...

谢谢你的帮助,加上sequence果然正确读取了。因为别人写的程序已经封装在模式里面了,如果要实现正确读取,是不是在生成要读取的数据程序中,设定的real和integer字节要与给定的type结构中的real和integer一致呢?同时数据存储的顺序也要与给定的type中的成员顺序一致呢?谢谢~
作者: 好好干    时间: 2017-2-19 17:00
百事可乐 发表于 2017-2-19 15:13
代码都通不过编译,楼主是怎么调试的?

我是调试其中主要的程序段,因为要测试自己生成的数据能否正确读入到别人给定的程序当中。
作者: li913    时间: 2017-2-19 17:07
本帖最后由 li913 于 2017-2-19 17:12 编辑
好好干 发表于 2017-2-19 16:58
谢谢你的帮助,加上sequence果然正确读取了。因为别人写的程序已经封装在模式里面了,如果要实现正确读取 ...

1. 读、写 所用变量类型和字节数必须一致;2. 变量顺序不一定是结构体里的顺序,但读、写时 顺序必须一致。比如点坐标point.x, point.y和point.z, 你可以按zxy输出,同时按zxy读取。

作者: 好好干    时间: 2017-2-19 17:12
li913 发表于 2017-2-19 17:07
这是肯定的。

谢谢你的回复!很给力~
作者: fcode    时间: 2017-2-19 17:13
除了 sequence 之外,不同的语言(或者编译器的设置),还可能有 结构体字节对齐的问题。你应该注意一下。
作者: 好好干    时间: 2017-2-19 17:16
fcode 发表于 2017-2-19 17:13
除了 sequence 之外,不同的语言(或者编译器的设置),还可能有 结构体字节对齐的问题。你应该注意一下。 ...

好的,谢谢~昨晚看了fcode独家教程之后,受益良多~




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2