Fortran Coder

标题: 数组越界求大神帮帮忙!!! [打印本页]

作者: qxqxaz    时间: 2020-6-16 20:43
标题: 数组越界求大神帮帮忙!!!
老师给了一段程序 运行起来后出现了下图的错误
[Fortran] 纯文本查看 复制代码
IF(INDEX.EQ.0) THEN        !排水
        DO J=1,M
        DO I=1,N
        IA(I,J)=1 !初始化,从全饱和开始
       !IA为含水(=1)、充气(=-1)指示矩阵        
        IF(B(I,J).EQ.0.0) IA(I,J)=-1 !接触局域假设为充气
        ENDDO
        ENDDO
        ELSE !吸水
        DO J=1,M
        DO I=1,N
        IA(I,J)=-1 !初始化,从干燥开始
       !IA为含水(=1)、充气(=-1)指示矩阵

Subscript #1 of the array IA has value 0 which is less than the lower bound of 1(运行时提示错误)。由于接触fortran的时间不长,自己弄了半天也没弄明白 希望有大神能指点一下。

QQ图片20200616204055.png (9.37 KB, 下载次数: 322)

QQ图片20200616204055.png

作者: fcode    时间: 2020-6-17 08:11
就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。

Fortran下标默认从1开始哟~~
作者: necrohan    时间: 2020-6-17 08:12
从你给的那段程序看,由于DO循环都是从1开始的,不会出现IA序号为0的情况,应该不是这段程序的问题。
作者: qxqxaz    时间: 2020-6-17 09:55
fcode 发表于 2020-6-17 08:11
就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。

按您说的,那是我这段代码里出错了吗?我自己看看都是从1开始循环的,所以不知道该怎么该。
作者: qxqxaz    时间: 2020-6-17 10:14
necrohan 发表于 2020-6-17 08:12
从你给的那段程序看,由于DO循环都是从1开始的,不会出现IA序号为0的情况,应该不是这段程序的问题。 ...

大神,能帮我在看一看是不是下面这段代码出了问题?
[Fortran] 纯文本查看 复制代码
IF(HIN.LT.0.0) THEN        !为非饱和状态
        IF(INDEX.EQ.0) THEN        !排水
        DO I=1,N
        IF(B(I,1).GT.BC) THEN
        IA(I,1)=-1
        ENDIF
        IF(B(I,M).GT.BC) THEN
        IA(I,M)=-1
        ENDIF
        ENDDO
        DO J=2,M-1
        DO I=1,N
        IF(IA(I,J-1).EQ.-1.AND.B(I,J).GT.BC) THEN
        IA(I,J)=-1
        KI=I
   10 KI=KI-1
        IF(KI.GE.1) THEN
        IF(B(KI,J).GT.BC) THEN
        IA(KI,J)=-1
        GOTO 10
        ENDIF
        ENDIF
        KI=I
   20 KI=KI+1
        IF(KI.LE.N) THEN
        IF(B(KI,J).GT.BC) THEN
        IA(KI,J)=-1
        GOTO 20
        ENDIF
        ENDIF
        ENDIF
        IF(IA(I,M-J+2).EQ.-1.AND.B(I,M-J+1).GT.BC) THEN
        IA(I,M-J+1)=-1
        KI=I
   30 KI=KI-1
        IF(KI.GE.1) THEN
        IF(B(KI,M-J+1).GT.BC) THEN
        IA(KI,M-J+1)=-1
        GOTO 30
        ENDIF
        ENDIF
        KI=I
   40 KI=KI+1
        IF(KI.LE.N) THEN
        IF(B(KI,M-J+1).GT.BC) THEN
        IA(KI,M-J+1)=-1
        GOTO 40
        ENDIF
        ENDIF
        ENDIF
        ENDDO
        ENDDO
        ELSE !吸水
        DO J=1,M
        DO I=1,N
        IF(B(I,J).EQ.0.0) B(I,J)=10.0
        ENDDO
        ENDDO
        DO I=1,N
        IF(B(I,1).LT.BC) THEN
        IA(I,1)=1
        ENDIF
        IF(B(I,M).LT.BC) THEN
        IA(I,M)=1
        ENDIF
        ENDDO
        DO J=2,M-1
        DO I=1,N
        IF(IA(I,J-1).EQ.1.AND.B(I,J).LT.BC) THEN
        IA(I,J)=1
        KI=I
   50 KI=KI-1
        IF(KI.GE.1) THEN
        IF(B(KI,J).LT.BC) THEN
        IA(KI,J)=1
        GOTO 50
        ENDIF
        ENDIF
        KI=I
   60 KI=KI+1
        IF(KI.LE.N) THEN
        IF(B(KI,J).LT.BC) THEN
        IA(KI,J)=1
        GOTO 60
        ENDIF
        ENDIF
        ENDIF
        IF(IA(I,M-J+2).EQ.1.AND.B(I,M-J+1).LT.BC) THEN
        IA(I,M-J+1)=1
        KI=I
   70 KI=KI-1
        IF(KI.GE.1) THEN
        IF(B(KI,M-J+1).LT.BC) THEN
        IA(KI,M-J+1)=1
        GOTO 70
        ENDIF
        ENDIF
        KI=I
   80 KI=KI+1
        IF(KI.LE.N) THEN
        IF(B(KI,M-J+1).LT.BC) THEN
        IA(KI,M-J+1)=1
        GOTO 80
        ENDIF
        ENDIF
        ENDIF
        ENDDO
        ENDDO
        DO J=1,M
        DO I=1,N
        IF(B(I,J).EQ.10.0) THEN
        B(I,J)=0.0
        IA(I,J)=-1 !接触局域假设为充气
        ENDIF
        ENDDO
        ENDDO
        ENDIF
        ENDIF

作者: necrohan    时间: 2020-6-18 09:27
楼主已经另开多贴,
http://bbs.fcode.cn/thread-2399-1-1.html
这个帖子有完整代码
作者: 12345    时间: 2024-4-10 13:29
请问这个问题最终是怎么解决的呀,我现在也遇到了类似的问题




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