回 帖 发 新 帖 刷新版面

主题:依然高分悬赏,求高手解答!

我编了一个子例行程序,当主程序段调用的时候显示数组越界。

主程序段部分
ISTEP是时间步循环,MTF是我编写的子例行程序

调试的时候发现在运行的过程中ISTEP=1120403456

但是在时间步是由外界输入的,最多NSTEP=20000

不知道为什么会变成这样 求解答!!!



DO 500 ISTEP=1,NSTEP

      CALL EXPLIT (ACCEH,ACCEV,AFACT,AZERO,AALFA,BZERO,DTIME,
     &            DTEND,FORCE,IFIXD,IFPRE,IFUNC,ISTEP,NDOFN,NPOIN,OMEGA,
     &             RESID,TDISP,VELOC,YMASS,SDISP)
    
    CALL MTF(SDISP,TDISP,ISTEP,DTIME,BOUND)    
————————————————————————————————————————————————

SUBROUTINE MTF(SDISP,TDISP,ISTEP,DTIME,BOUND)
    REAL S,CA,U(400,20000,2),DX,T11,T12,T13,TDISP(400)
    REAL T21,T22,T23,T24,T25,BOUND(33,5),SDISP(400,2)
    INTEGER IBOUN,J,IDOFN,NBOUN,I,BNODE

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CC                                                                      cc
CC  THIS SUBROUTINE IS ARTIFICIAL BOUNDRY CONDITIONS                    cc
CC                                                                      cc
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC


    IF (ISTEP.LE.2) GO TO 60    


    NBOUN=33

    DX=10.0
    CA=0.001
    S=(CA*DTIME)/DX
    
    T11=(2-S)*(1-S)/2
    T12=S*(2-S)
    T13=S*(S-1)/2
    
    T21=T11*T11
    T22=2*T11*T12
    T23=2*T11*T13+T12*T12
    T24=2*T12*T13
    T25=T13*T13
    
    DO 10 IBOUN=1,NBOUN
    
    READ(10,*) (BOUND(IBOUN,J),J=1,5)

10    CONTINUE
    

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CC    提取边界点P时刻与P-1时刻的位移值      CC
CC     从第三时步开始                       CC  
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    DO 30 IBOUN=1,NBOUN
      DO 30 J=1,5

    BNODE=(BOUND(IBOUN,J)-1)*2+1

         U(BOUND(IBOUN,J),ISTEP-2,1)=SDISP(BNODE,1)
         U(BOUND(IBOUN,J),ISTEP-1,1)=SDISP(BNODE,2)

    BNODE=BNODE+1

       U(BOUND(IBOUN,J),ISTEP-2,2)=SDISP(BNODE,1)
         U(BOUND(IBOUN,J),ISTEP-1,2)=SDISP(BNODE,2)

30    CONTINUE

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CC   从第三时步起计算边界位移值   CC 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC    
    DO 40 IBOUN=1,NBOUN
        DO 40 I=1,2

            U(BOUND(IBOUN,1),ISTEP,I)=T11*U(BOUND(IBOUN,1),ISTEP-1,I)+
     &T12*U(BOUND(IBOUN,2),ISTEP-1,I)+T13*U(BOUND(IBOUN,3),ISTEP-1,I)+
     &T21*U(BOUND(IBOUN,1),ISTEP-2,I)+T22*U(BOUND(IBOUN,2),ISTEP-2,I)+
     &T23*U(BOUND(IBOUN,3),ISTEP-2,I)+T24*U(BOUND(IBOUN,4),ISTEP-2,I)+
     &T25*U(BOUND(IBOUN,5),ISTEP-2,I)

40    CONTINUE

CCCCCCCCCCCCCCCCCCCCCCCCCC
CC   导出边界点位移值   CC
CCCCCCCCCCCCCCCCCCCCCCCCCC
    DO 50 IBOUN=1,NBOUN

          BNODE=(BOUND(IBOUN,1)-1)*2+1
            TDISP(BNODE)= U(BOUND(IBOUN,1),ISTEP,1)
    

            BNODE=BNODE+1
            TDISP(BNODE)= U(BOUND(IBOUN,1),ISTEP,2)

    
50    CONTINUE
    
    
60    CONTINUE
      END
——————————————————————————————————————————————————

回复列表 (共18个回复)

沙发

我给你一个示范
    real i
    do i=1,20000
    write(*,"(I15)")i
    enddo
    end
运行后你会发现输出的数据有10位与出现的ISTEP=1120403456 也是10位数据.
原因是我们定义的是实型数据i,但输出的是用整型格式,所以有问题。
你看一下是不是你程序中有没有类似的情况。

板凳

别外我发现你调试时ISTEP=1120403456,
我经过计算ISTEP的实际值可能是ISTEP=100 ,你再检查看看。

3 楼

程序的完整版本太大,没法发给你。
ISTEP不可能是100,另外 ISTEP是实型。当我在主程序段中定义它为整型的时候,发现
ISTEP=1116209152
求解答!

4 楼

没implicit none这个程序谁调谁吃力. 而且是老风格. 没办法, 只能让有心人看了.

5 楼

换用高版本的编译器编译看看WARNING基本能解决很多隐藏的问题:)

6 楼

大的程序,要我们去发现出错原因是很麻烦的。首先语法上即使没有问题,但我们的算法可能有缺陷同样也不行,而且这种错误我们很可能是察觉不到,非常危险哦。至于你的问题,我看你的子程序就书写不规范,你说ISTEP是实型,但子程序中没有定义为实型,按默认就成了整型。4楼和5楼的兄弟(姐妹)说得很有道理,你可以试一试。另外你可以运行下面的程序,看是否能发现什么。如果还没有解决,你可以把程序发到我的QQ邮件。
real i
i=100
call aa(i)
end
subroutine aa(i)
write(*,*)i
end subroutine

7 楼

楼上说的有道理。

调用子程序时一定要保证传递数据类型的一致,否则必然出错。

8 楼

你那段小程序,
real i
i=100
call aa(i)
end
subroutine aa(i)
write(*,*)i
end subroutine
运行的时候显示警告实参和哑参不匹配

我在subroutine中重新定义 i为实型就没问题了
——————————————————————————
至于我的那段程序确实很古老,是1980年的D.R.J.欧文和E.辛顿编写的

ISTEP我前面说是实型是错的  应该是整型  取值从1到20000

这个是fortran程序中默认的吧  符合I-N规则

大神你给我个邮箱号,我把程序给你发过去。

9 楼

既然是老程序就只好慢慢调了. I-N规则规则在我看来就是踩雷. 帮人调过几个程序都遇到过不小心打错的变量.

既然编译器提示不匹配说明它还是检查接口的, 是不是你自己写的这个程序没有写接口?

10 楼

最悲惨的是有次我吧0(零)打成了o(字母),编译器竟然没发现,找这个错误找的我好苦啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册