FORTRAN中的错误forrtl:severe<161>:Program Exception-array bounds exceeded

来源:百度知道 编辑:UC知道 时间:2024/06/04 15:49:48
固定格式
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),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 数组在子程序中根本没有赋值,就直接使用。结果无法预料,也是非常危险的。

检查你的数组,是不是有下表越界的情况