数组越界求大神帮帮忙!!!
老师给了一段程序 运行起来后出现了下图的错误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的时间不长,自己弄了半天也没弄明白 希望有大神能指点一下。
就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。
Fortran下标默认从1开始哟~~ 从你给的那段程序看,由于DO循环都是从1开始的,不会出现IA序号为0的情况,应该不是这段程序的问题。 fcode 发表于 2020-6-17 08:11
就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。
按您说的,那是我这段代码里出错了吗?我自己看看都是从1开始循环的,所以不知道该怎么该。 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 楼主已经另开多贴,
http://bbs.fcode.cn/thread-2399-1-1.html
这个帖子有完整代码 请问这个问题最终是怎么解决的呀,我现在也遇到了类似的问题
页:
[1]