作业帮 > 综合 > 作业

FORTRAN中的错误forrtl:severe:Program Exception-array bounds exce

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/26 17:51:40
FORTRAN中的错误forrtl:severe:Program Exception-array bounds exceeded
固定格式
program main
IMPLICIT NONE
DOUBLE PRECISION::XJ1,XJ2,XJ3,XM1,XM2,XM3
DOUBLE PRECISION ,EXTERNAL::S3J
DOUBLEPRECISION::JM,J12,J13,J23,J,JM11,JM12,JM21,JM22,JM31,JM32
DOUBLEPRECISION::A,B,K,B0,CK,CC,IFX(164),SLNF(164),SLNI(164)
DOUBLEPRECISION::SLNJ6(164),MJ31,MJ32
XJ1=0.500
XJ2=0.500
XJ3=0.00
XM1=0.500
XM2=-0.500
XM3=0.00
WRITE(*,*) S3J(XJ1,XJ2,XJ3,XM1,XM2,XM3)
STOP
END
DOUBLE PRECISION FUNCTION S3J(XJ1,XJ2,XJ3,XM1,XM2,XM3)
IMPLICIT NONE
DOUBLEPRECISION(A-H,O-O)
DOUBLE PRECISION::M,JM,J12,J13,J23,J,JM11,JM12,JM21,JM22,JM31
DOUBLE PRECISION::JM32,MJ31,MJ32
DOUBLE PRECISION::A,B,K,B0,CK,CC,IFX(164),SLNI,SLNF,SLNJ
DOUBLE PRECISION::XJ1,XJ2,XJ3,XM1,XM2,XM3,DABS,DEXP,DSQRT
COMMON/LNFJ/SLNI(164),SLNF(164),SLNJ(164)
IF(DABS(XM1).GT.XJ1.OR.DABS(XM2).GT.XJ2.OR.DABS(XM3).GT.XJ3)
1 GOTO 10
M=IFX(XM1+XM2+XM3)
JM=IFX(XJ1-XJ2-XM3)
J12=IFX(XJ1+XJ2-XJ3)
J13=IFX(XJ1-XJ2+XJ3)
J23=IFX(-XJ1+XJ2+XJ3)
J=IFX(XJ1+XJ2+XJ3)
JM11= IFX(XJ1+XM1)
JM12=IFX(XJ1-XM1)
JM21=IFX(XJ2+XM2)
JM22=IFX(XJ2-XM2)
JM31=IFX(XJ3+XM3)
JM32=IFX(XJ3-XM3)
MJ32=IFX(XJ3-XJ2+XM1)
MJ31=IFX(XJ3-XJ1-XM2)
IF(M.NE.0.OR.J12.LT.0.OR.J13.LT.0.OR.J23.LT.0) GOTO 10
A=SLNF(J12+1)+SLNF(J13+1)+SLNF(J23+1)+SLNF(JM11+1)+SLNF(JM12+1)+
2 SLNF(JM21+1)+SLNF(JM22+1)+SLNF(JM31+1)+SLNF(JM32+1)-SLNF(J+2)
A=DEXP(A)
A=DSQRT(A)
B=0.0D0
DO 1 K=0,10000
IF(J12-K.LT.0.OR.JM12-K.LT.0.OR.JM21-K.LT.0.OR.MJ32+K.LT.0.OR.
3 MJ31+K.LT.0) GOTO 1
B0=-SLNF(K+1)-SLNF(J12-K+1)-SLNF(JM12-K+1)-SLNF(JM21-K+1)-
4 SLNF(MJ32+K+1)-SLNF(MJ31+K+1)
IF(DABS(B0).LT.0.1E-70) GOTO 1
B0=DEXP(B0)
IF(K.EQ.0) CK=1.D0
IF(K.NE.0) CK=(-1D0)**K
B=B+CK*B0
1 CONTINUE
IF(JM.EQ.0) CC=1.D0
IF(JM.NE.0) CC=(-1.D0)**JM
S3J=CC*A*B
GOTO 20
10 S3J=0.0D0
20 CONTINUE
write(*,*)S3J,XJ1,XJ2,XJ3,XM1,XM2,XM3
write(*,*)S3J,XJ1,XJ2,XJ3,XM1,XM2,XM3
2 FORMAT(2X,6F7.2,/2X,'3J=',E15.7)
RETURN
END
--------------------Configuration:3J_12_CORRECT - Win32 Debug--------------------
3J_12_CORRECT.exe - 0 error(s),0 warning(s)
连接没问题,执行时出错!
我是个新手,不懂数组下表越界啊,
这是个垃圾程序.
首先
IF(DABS(B0).LT.0.1E-70) GOTO 1
这一句
0.1 的 -70 次方,用单精度无法表示.如果要写成双精度,应该用 0.1D-70
其次.
XM1=0.500
XM2=-0.500
XM3=0.00
三者相加等于 0.
而 M=IFX(XM1+XM2+XM3) 这一句,使用了 IFX 的第 0 个元素.该数组定义为 1:164,造成数组越界.
而且,IFX 数组在子程序中根本没有赋值,就直接使用.结果无法预料,也是非常危险的.