Fortran Coder

查看: 17229|回复: 5

[求助] 数组越界求大神帮帮忙!!!

[复制链接]

5

帖子

3

主题

0

精华

新人

F 币
26 元
贡献
16 点
发表于 2020-6-16 20:43:51 | 显示全部楼层 |阅读模式
老师给了一段程序 运行起来后出现了下图的错误
[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

1948

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1298 元
贡献
547 点

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

发表于 2020-6-17 08:11:44 | 显示全部楼层
就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。

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

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

发表于 2020-6-17 08:12:55 | 显示全部楼层
从你给的那段程序看,由于DO循环都是从1开始的,不会出现IA序号为0的情况,应该不是这段程序的问题。

5

帖子

3

主题

0

精华

新人

F 币
26 元
贡献
16 点
 楼主| 发表于 2020-6-17 09:55:16 | 显示全部楼层
fcode 发表于 2020-6-17 08:11
就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。

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

5

帖子

3

主题

0

精华

新人

F 币
26 元
贡献
16 点
 楼主| 发表于 2020-6-17 10:14:58 | 显示全部楼层
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

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

发表于 2020-6-18 09:27:14 | 显示全部楼层
楼主已经另开多贴,
http://bbs.fcode.cn/thread-2399-1-1.html
这个帖子有完整代码
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-3-29 14:59

Powered by Tencent X3.4

© 2013-2024 Tencent

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