qxqxaz 发表于 2020-6-16 20:43:51

数组越界求大神帮帮忙!!!

老师给了一段程序 运行起来后出现了下图的错误
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的时间不长,自己弄了半天也没弄明白 希望有大神能指点一下。

fcode 发表于 2020-6-17 08:11:44

就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。

Fortran下标默认从1开始哟~~

necrohan 发表于 2020-6-17 08:12:55

从你给的那段程序看,由于DO循环都是从1开始的,不会出现IA序号为0的情况,应该不是这段程序的问题。

qxqxaz 发表于 2020-6-17 09:55:16

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



按您说的,那是我这段代码里出错了吗?我自己看看都是从1开始循环的,所以不知道该怎么该。

qxqxaz 发表于 2020-6-17 10:14:58

necrohan 发表于 2020-6-17 08:12
从你给的那段程序看,由于DO循环都是从1开始的,不会出现IA序号为0的情况,应该不是这段程序的问题。 ...
大神,能帮我在看一看是不是下面这段代码出了问题?
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:14

楼主已经另开多贴,
http://bbs.fcode.cn/thread-2399-1-1.html
这个帖子有完整代码

12345 发表于 2024-4-10 13:29:39

请问这个问题最终是怎么解决的呀,我现在也遇到了类似的问题
页: [1]
查看完整版本: 数组越界求大神帮帮忙!!!