Fortran Coder

查看: 10686|回复: 8
打印 上一主题 下一主题

[派生类型] 派生结构读取数据问题

[复制链接]

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

跳转到指定楼层
楼主
发表于 2017-2-19 11:35:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好!我有个关于派生结构读取数据的问题,想请教一下。
现在我有一个别人写好的程序,利用派生结构读取数据,但是我在自己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

程序代码

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
沙发
发表于 2017-2-19 11:54:26 | 只看该作者
1、vs停止工作,可能是软件本身的原因。
2、没有输入文件,别人无法调试。
3、可以看看这个 http://fcode.cn/guide-62-1.html
4、给出错误提示。


100

帖子

0

主题

0

精华

专家

F 币
550 元
贡献
291 点

规矩勋章元老勋章

QQ
板凳
发表于 2017-2-19 15:13:58 | 只看该作者
代码都通不过编译,楼主是怎么调试的?

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

地板
 楼主| 发表于 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中的成员顺序一致呢?谢谢~

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

5#
 楼主| 发表于 2017-2-19 17:00:03 | 只看该作者
百事可乐 发表于 2017-2-19 15:13
代码都通不过编译,楼主是怎么调试的?

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

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
6#
发表于 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读取。

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

7#
 楼主| 发表于 2017-2-19 17:12:13 | 只看该作者

谢谢你的回复!很给力~

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

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

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

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

好的,谢谢~昨晚看了fcode独家教程之后,受益良多~
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 04:08

Powered by Tencent X3.4

© 2013-2024 Tencent

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