Fortran Coder

查看: 11901|回复: 3
打印 上一主题 下一主题

[数值问题] 数组赋值以后前面变成乱码,后面正常

[复制链接]

7

帖子

2

主题

0

精华

入门

F 币
34 元
贡献
20 点
跳转到指定楼层
楼主
发表于 2018-1-30 22:45:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
求助各位大神:循环运算的数组,一开始都正常,在循环到某个数的时候(比如jj=1525)时,数组前面的值全部变为乱码,但1525之后的是正常,请问是什么原因啊?应该不是代码的原因,因为一开始是对的,突然就变为乱码了,从来没有遇到过类似的问题。
程序如下:(有点长,主要是输出sta2(:)的时候出错),结尾附有输出文件图片,求各位帮帮忙
[Fortran] 纯文本查看 复制代码
program select_fog 
implicit none
integer, parameter::U=6,N=1000000
integer num,m,i,Key,key2
real def
!character*6,allocatable::star(:)
!character*4,allocatable::yearr(:)
!character*2,allocatable::monthr(:),datr(:)
!real,allocatable::raind(:),rainn(:)
character*5 star(N)
character*4 yearr(N)
character*2 monthr(N),datr(N)
real*8 raind(N),rainn(N)

character*50 fl(U)
character*50 filename,fpathin,fileput

def=9999.
fpathin='F:\data\fog\meteo\rain\*.txt'  !!!改路径
filename='F:\data\fog\meteo\namelist_rain.txt'  !!!改路径
call ListToFile(fpathin,filename)
open(1,file=filename)
num=1
do while(.true.)
   read(1,*,iostat=Key) fileput
   if(Key/=0)then
        exit
   endif
        fl(num)=trim(fileput)
        num=num+1
end do
close(1)
print*,'the number of meteo data is',num-1

!ALLOCATE(star(nx),yearr(nx),monthr(nx),datr(nx),raind(nx),rainn(nx))
i=1
do m=1,num-1
   open(m*10,file=fl(m),status='old')
   print*,'reading the rain file:',fl(m)
   read(m*10,*)
   do while(.true.)
        read(m*10,*,iostat=key2) star(i),yearr(i),monthr(i),datr(i),raind(i),rainn(i)
        if(key2/=0)then
            exit
        endif
      !  print*,star(i),yearr(i),monthr(i),datr(i),raind(i),rainn(i)
        i=i+1
   enddo
   close(m*10)
enddo
!N=i-1
!print*,'N=',N
!DEALLOCATE(star,yearr,monthr,datr,raind,rainn)
!ALLOCATE(star(N),yearr(N),monthr(N),datr(N),raind(N),rainn(N))

!---------------the following code is the main part of fortran ------------------------
call selectmodule(star,yearr,monthr,datr,raind,rainn,N)

!DEALLOCATE(star,yearr,monthr,datr,raind,rainn)

end program

subroutine selectmodule(star,yearr,monthr,datr,raind,rainn,N)
implicit none
!integer, parameter::U=12,nxx=10000000,nyy=1000000
integer, parameter::U=12,nxx=250000,nyy=200000
integer N,i,j,k,num,KK,m,flag,ii,jj,cc
integer kk2
real def
character*5 sta(nxx),sta2(nyy)
character*4 year(nxx),year2(nyy)
character*2 month(nxx),dat(nxx),month2(nyy),dat2(nyy)
character*2 tim(nxx),tim2(nyy)
character*5 fx(nxx),fx2(nyy),fx_12(nyy)
real*8 pa(nxx),vis(nxx),fs(nxx),tc(nxx),lc(nxx),tt(nxx),rh(nxx)
real*8 pa2(nyy),vis2(nyy),fs2(nyy),tc2(nyy),lc2(nyy),tt2(nyy),rh2(nyy),pa_12(nyy),tt_12(nyy),rh_12(nyy),fs_12(nyy)

character*5 star(N)
character*4 yearr(N)
character*2 monthr(N),datr(N),ctim(4)
real*8 raind(N),rainn(N)

character*50 fl(U)
character*50 filename,fpathin,fileput

def=9999.
jj=1
fpathin='F:\data\fog\meteo\lotdata\*.txt'  !!!改路径
filename='F:\data\fog\meteo\namelist_lotdata.txt'  !!!改路径
call ListToFile(fpathin,filename)
open(2,file=filename)
num=1
do while(.true.)
   read(2,*,iostat=KK) fileput
   if(KK/=0)then
        EXIT
   endif
        fl(num)=trim(fileput)
        num=num+1
end do
close(2)
do m=1,num-1
    j=1
    i=1
    open(m*11,file=fl(m),status='old')
    print*,'reading the meteo lot data:',fl(m)  
    read(m*11,*)
    do while(.true.)
        read(m*11,*,iostat=kk2) sta(i),year(i),month(i),dat(i),tim(i),pa(i),tt(i),rh(i),tc(i),lc(i),vis(i),fs(i),fx(i)
        if(kk2/=0)then
            EXIT
        endif
        !print*,sta(i),year(i),month(i),dat(i),tim(i),pa(i),tt(i),rh(i),tc(i),lc(i),vis(i),fs(i),fx(i)
        flag=0
        if(vis(i)<=1) then
            j=i
            do while(tim(i)/='20')
                i=i+1
                read(m*11,*) sta(i),year(i),month(i),dat(i),tim(i),pa(i),tt(i),rh(i),tc(i),lc(i),vis(i),fs(i),fx(i)
                !print*,sta(i),year(i),month(i),dat(i),tim(i),pa(i),tt(i),rh(i),tc(i),lc(i),vis(i),fs(i),fx(i)
            enddo
            if(tc(i)>=8.and.tc(i-1)>=8.and.tc(i-2)>=8)then
                flag=1
            endif           
            do while(flag==1)
                i=j
                do ii=1,N
                    if(star(ii)==sta(i).and.yearr(ii)==year(i))then
                        if(monthr(ii)==month(i).and.datr(ii)==dat(i))then
                            if(tim(i)=='2'.or.tim(i)=='8')then
                                    if(rainn(ii-1)>0.0.and.rainn(ii-1)/=def)then
                                        sta2(jj)=sta(i)
                                        year2(jj)=year(i)
                                        month2(jj)=month(i)
                                        dat2(jj)=dat(i)
                                        tim2(jj)=tim(i)
                                        pa2(jj)=pa(i)
                                        tt2(jj)=tt(i)
                                        rh2(jj)=rh(i)
                                        tc2(jj)=tc(i)
                                        lc2(jj)=lc(i)
                                        vis2(jj)=vis(i)
                                        fs2(jj)=fs(i)
                                        fx2(jj)=fx(i)
                                        pa_12(jj)=pa(i-2)
                                        tt_12(jj)=tt(i-2)
                                        rh_12(jj)=rh(i-2)
                                        fs_12(jj)=fs(i-2)
                                        fx_12(jj)=fx(i-2)
                                        !if(sta2(1)/='56598')then
                                            !print*,'debug'
                                        !endif
                                        jj=jj+1
                                        exit
                                    else 
                                        exit
                                    endif                                
                            else if(tim(i)=='14'.or.tim(i)=='20') then
                                    if(raind(ii)>0.0.and.raind(ii)/=def)then
                                        sta2(jj)=sta(i)
                                        year2(jj)=year(i)
                                        month2(jj)=month(i)
                                        dat2(jj)=dat(i)
                                        tim2(jj)=tim(i)
                                        pa2(jj)=pa(i)
                                        tt2(jj)=tt(i)
                                        rh2(jj)=rh(i)
                                        tc2(jj)=tc(i)
                                        lc2(jj)=lc(i)
                                        vis2(jj)=vis(i)
                                        fs2(jj)=fs(i)
                                        fx2(jj)=fx(i)
                                        pa_12(jj)=pa(i-2)
                                        tt_12(jj)=tt(i-2)
                                        rh_12(jj)=rh(i-2)
                                        fs_12(jj)=fs(i-2)
                                        fx_12(jj)=fx(i-2)
                                        !if(sta2(1)/='56598')then
                                            !print*,'debug'
                                        !endif
                                        jj=jj+1
                                        exit
                                    else 
                                        exit
                                    endif
                            end if
                        endif
                    endif
                enddo
                flag=0
            enddo
            i=j
        endif
        i=i+1
    enddo
    close(m*11) 
enddo
print*,'i=',i-1 
!DEALLOCATE(sta,year,month,dat,tim,pa,tt,rh,tc,lc,vis,fs,fx)

cc=jj-1
print*,'the total fog number is ',cc  
data (ctim(i),i=1,4)/'02','14','08','20'/
do k=1,4
    open(k*111,file='F:\data\fog\meteo\out\FOG_'//ctim(k)//'.txt') !改路径
enddo
!print*,(tim2(i),i=1,cc)
!do k=1,cc
    !print*,year2(k),month2(k),dat2(k),tim2(k),pa2(k),tt2(k),rh2(k),tc2(k)!,&
            !lc2(k),vis2(k),fs2(k),fx2(k),pa_12(k),tt_12(k),rh_12(k),fs_12(k),fx_12(k)
!enddo
do k=1,cc
    select case(tim2(k))
        case('2')
            !write(111,*) '站点 年 月 日 时 气压 温度 相对湿度 总云量 低云量 能见度 风速 风向 前12h气压 前12h温度 前12h相对湿度 前12h风速 前12h风向'
            write(111,200) sta2(k),year2(k),month2(k),dat2(k),tim2(k),pa2(k),tt2(k),rh2(k),tc2(k),&
            lc2(k),vis2(k),fs2(k),fx2(k),pa_12(k),tt_12(k),rh_12(k),fs_12(k),fx_12(k)
        case('8')
            write(222,200) sta2(k),year2(k),month2(k),dat2(k),tim2(k),pa2(k),tt2(k),rh2(k),tc2(k),&
            lc2(k),vis2(k),fs2(k),fx2(k),pa_12(k),tt_12(k),rh_12(k),fs_12(k),fx_12(k)
        case('14')
            write(333,200) sta2(k),year2(k),month2(k),dat2(k),tim2(k),pa2(k),tt2(k),rh2(k),tc2(k),&
            lc2(k),vis2(k),fs2(k),fx2(k),pa_12(k),tt_12(k),rh_12(k),fs_12(k),fx_12(k)
        case('20')
            write(444,200) sta2(k),year2(k),month2(k),dat2(k),tim2(k),pa2(k),tt2(k),rh2(k),tc2(k),&
            lc2(k),vis2(k),fs2(k),fx2(k),pa_12(k),tt_12(k),rh_12(k),fs_12(k),fx_12(k)
    end select
enddo
200 format(a5,1x,a4,1x,a2,1x,a2,1x,a2,1x,f7.2,1x,f4.1,1x,f5.1,1x,f4.1,1x,f4.1,1x,f5.2,1x,f4.1,1x,&
a4,1x,f7.2,1x,f4.1,1x,f5.1,1x,f4.1,1x,a4)
!DEALLOCATE(sta2,year2,month2,dat2,tim2,pa2,tt2,rh2)
!DEALLOCATE(tc2,lc2,vis2,fs2,fx2,pa_12,tt_12,rh_12,fs_12,fx_12)
do k=1,4
    close(k*111)
enddo
print*,'the program is over. Good luck!'
endsubroutine


subroutine ListToFile(fpathin,filename)
character*(*),intent(in)::fpathin,filename
character*100 CMD
CMD="dir /a-d/b/s "//trim(fpathin)//">"//trim(filename)
call SYSTEM(CMD)
endsubroutine

Fortran出错.png (42.45 KB, 下载次数: 345)

Fortran出错.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

7

帖子

2

主题

0

精华

入门

F 币
34 元
贡献
20 点
沙发
 楼主| 发表于 2018-1-30 22:47:22 | 只看该作者
输出的第一行后面是对的,前面是各种字符,E、C之类的

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

板凳
发表于 2018-1-31 09:37:08 | 只看该作者
代码实在太长了,请加入本站QQ群 2338021
然后让群主QQ远程桌面,帮忙看看吧

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1642 元
贡献
709 点

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

地板
发表于 2018-2-1 10:45:07 | 只看该作者
建议你学习单步断点调试方法,逻辑问题自行排查,才能进步。
http://debug.w.fcode.cn
http://v.fcode.cn/video-debugger.html
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-26 21:40

Powered by Tencent X3.4

© 2013-2024 Tencent

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