Fortran Coder

标题: 用include来读取一个数组的时候碰到的问题 [打印本页]

作者: Villain    时间: 2014-10-17 16:24
标题: 用include来读取一个数组的时候碰到的问题
在debug一个程序的时候发现了这样的一个bug:
有个头文件output_step.h的内容大致如下:


!====2D output
    nt2d(1)=1 ; nt2d(2)=243
!    nt2d(1)=3286 ; nt2d(2)=3650
!====time-series output(nts分記入,stepは重複しないようにする)
    nnts(1,1)=    1 ; nnts(1,2)=  243
    nnts(2,1)=  366 ; nnts(2,2)=  730
    nnts(3,1)=  731 ; nnts(3,2)= 1095
    nnts(4,1)= 1096 ; nnts(4,2)= 1460
    nnts(5,1)= 1461 ; nnts(5,2)= 1825
    nnts(6,1)= 1826 ; nnts(6,2)= 2190
    nnts(7,1)= 2191 ; nnts(7,2)= 2555
    nnts(8,1)= 2556 ; nnts(8,2)= 2920
    nnts(9,1)= 2921 ; nnts(9,2)= 3285
    nnts(10,1)= 3286 ; nnts(10,2)= 3650

主程序中用include来读取一个头文件,大概内容如下
implicit none
(省略部分)
    include "output_step.h"
!====debug==
    write(*,*)nnts(1,1)
    write(*,*)nnts(1,2)
    write(*,*)nnts(2,1)
    write(*,*)nnts(2,2)

(省略部分)

end

电脑是64位,windows7,编译器是Microsoft Visual Studio Fortran2008
用ifort 编译,结果是:
1
366
366
731

也就是说读入了数据以后马上就输出,没有经过任何数值计算,结果竟然错了。一开始以为Fortran数据储存的方式是先循环前面的,然后出现了这个bug,可是看这组数据貌似不是那么简单了。

我瞬间就凌乱了,难道我电脑也是醉了吗?
这让我以后还敢用include吗?

求各位大神指点到底是什么原因``


Image 1.png (1005 Bytes, 下载次数: 283)

Image 1.png

作者: 楚香饭    时间: 2014-10-17 17:14
传所有代码吧
作者: Villain    时间: 2014-10-17 17:36
由于write 后面的部分没有参与所以省略不计
程序如下
[Fortran] 纯文本查看 复制代码

program xx
    implicit none
    include "param.h"
    include "TECIO_mod.f90"
    real(8) :: X(ngi,ngj),Y(ngi,ngj),T(ni,nj),SS(ni,nj),TURB(ni,nj),U(ni,nj),V(ni,nj),yvd(ngj),dx(ni)
    real(8),allocatable :: XT(:,:),YT(:,:),TT(:,:),SST(:,:),TURBT(:,:),UT(:,:),VT(:,:)
    real(8) :: dys,ytmp1,ytmp2
    integer :: i,j,ii,jj,tloop,io
    integer :: dts,dto,tts1,tts2
    integer :: iyr,imon,iday,ihour,niu,njs
    integer :: js(ni)
!====Variables for Tecplot-Binary Output
    integer(4) :: ti,tiii,imax,jmax,kmax,debug,disdouble,visdouble
    integer(4) :: strandid,parentzn
    integer(4) :: pvl(7),valloc(7),sharingzone(7)
    real(8) :: soltime1,soltime2
    character(len=1) :: nulchar
    character(len=15) :: timchar1,timchar2
    include "output_step.h"
   
!====debug==
    write(*,*)nnts(1,1)
    write(*,*)nnts(1,2)
    write(*,*)nnts(2,1)
    write(*,*)nnts(2,2)

end

output_step.h 文件的内容已经完整传上来了。可以看到前面的代码都只是定义变量的部分,跟这部分应该没有关系。


作者: 楚香饭    时间: 2014-10-17 17:41
本帖最后由 楚香饭 于 2014-10-17 17:44 编辑

根据你已有的代码来看,不会出错,实际上在我这里也是正常的。

建议你无省略的上传所有代码(可打包,上传附件)





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