好好干 发表于 2017-2-19 11:35:30

派生结构读取数据问题

大家好!我有个关于派生结构读取数据的问题,想请教一下。
现在我有一个别人写好的程序,利用派生结构读取数据,但是我在自己IVF(Windows)下调试时,IVF就卡住自动重启了,主要的代码如下:
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行)。谢谢大家!

li913 发表于 2017-2-19 11:54:26

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


百事可乐 发表于 2017-2-19 15:13:58

代码都通不过编译,楼主是怎么调试的?

好好干 发表于 2017-2-19 16:58:44

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:03

百事可乐 发表于 2017-2-19 15:13
代码都通不过编译,楼主是怎么调试的?

我是调试其中主要的程序段,因为要测试自己生成的数据能否正确读入到别人给定的程序当中。

li913 发表于 2017-2-19 17:07:13

本帖最后由 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:13

li913 发表于 2017-2-19 17:07
这是肯定的。

谢谢你的回复!很给力~:-P

fcode 发表于 2017-2-19 17:13:36

除了 sequence 之外,不同的语言(或者编译器的设置),还可能有 结构体字节对齐的问题。你应该注意一下。

好好干 发表于 2017-2-19 17:16:13

fcode 发表于 2017-2-19 17:13
除了 sequence 之外,不同的语言(或者编译器的设置),还可能有 结构体字节对齐的问题。你应该注意一下。 ...

好的,谢谢~昨晚看了fcode独家教程之后,受益良多~
页: [1]
查看完整版本: 派生结构读取数据问题