运行-时间检查 Fortran 数组边界检查未触发
Run-time check on Fortran array bounds check not triggering
我已经为 "prove" 制作了这个小测试程序,你不能在编译前指定它们的大小(或者如果你使它们可分配)就使用向量。我的观点失败了。我原以为本地向量 "num" 会失败。程序在执行程序之前无法知道它的大小。大小,点头,是在执行时从用户那里读取的。我使用以下命令编译:
gfortan -fcheck=all test.f90
"nod"的值在执行过程中被给定为500000000
gfortran 版本为 6.3.0
执行 "fine" 并返回以下答案:
7 9.9000000000000004 9.9000000000000004 500000000
所以我的问题是;为什么编译器不向我抛出我在(未定义的)向量之外编写的错误?我想它看到了我的错误并救了我??通过使其可分配?还是我完全错了?
MODULE globaldata
IMPLICIT NONE
INTEGER nod
END MODULE globaldata
MODULE modtest
USE globaldata
IMPLICIT NONE
CONTAINS
SUBROUTINE mysubtest(dummy)
IMPLICIT NONE
INTEGER :: dummy
REAL(kind=8) :: num(nod)
dummy = 7
num = 9.9d0
write(*,*) dummy,num(1),num(nod),size(num)
END SUBROUTINE mysubtest
END MODULE modtest
PROGRAM test
USE globaldata
USE modtest
IMPLICIT NONE
INTEGER dummy1
WRITE(*,*)"Give the value of nod:"
READ(*,*) nod
CALL mysubtest(dummy1)
END PROGRAM test
当然可以有显式数组,其大小在编译时未知(使用命名或文字 constant/constant 表达式)。这些实体称为 自动对象 。但是,它们的出现位置受到限制。
显式数组可以出现在任何程序单元的规范部分。
主程序或模块范围内的变量确实必须具有常量表达式的大小。更一般地说,显式大小数组的数组大小表达式是 规范表达式 ,对于局部变量,这些表达式不需要是常量表达式。
在您的测试用例中,数组 num
是 mysubtest
的局部变量。 nod
是一个模块变量,可通过主机关联访问(并在该主机中使用关联),因此形成了一个非常有效的规范表达式:数组 num
的大小为 nod
in [=11] =],无论调用子例程时 nod
的值如何。
有关规范表达式中允许的内容的详细信息,请参见 Fortran 2018,10.1.11。
自动对象可能会出现在其他地方或由于数组大小以外的原因而自动,但这与问题的情况无关。
我已经为 "prove" 制作了这个小测试程序,你不能在编译前指定它们的大小(或者如果你使它们可分配)就使用向量。我的观点失败了。我原以为本地向量 "num" 会失败。程序在执行程序之前无法知道它的大小。大小,点头,是在执行时从用户那里读取的。我使用以下命令编译:
gfortan -fcheck=all test.f90
"nod"的值在执行过程中被给定为500000000
gfortran 版本为 6.3.0
执行 "fine" 并返回以下答案:
7 9.9000000000000004 9.9000000000000004 500000000
所以我的问题是;为什么编译器不向我抛出我在(未定义的)向量之外编写的错误?我想它看到了我的错误并救了我??通过使其可分配?还是我完全错了?
MODULE globaldata
IMPLICIT NONE
INTEGER nod
END MODULE globaldata
MODULE modtest
USE globaldata
IMPLICIT NONE
CONTAINS
SUBROUTINE mysubtest(dummy)
IMPLICIT NONE
INTEGER :: dummy
REAL(kind=8) :: num(nod)
dummy = 7
num = 9.9d0
write(*,*) dummy,num(1),num(nod),size(num)
END SUBROUTINE mysubtest
END MODULE modtest
PROGRAM test
USE globaldata
USE modtest
IMPLICIT NONE
INTEGER dummy1
WRITE(*,*)"Give the value of nod:"
READ(*,*) nod
CALL mysubtest(dummy1)
END PROGRAM test
当然可以有显式数组,其大小在编译时未知(使用命名或文字 constant/constant 表达式)。这些实体称为 自动对象 。但是,它们的出现位置受到限制。
显式数组可以出现在任何程序单元的规范部分。 主程序或模块范围内的变量确实必须具有常量表达式的大小。更一般地说,显式大小数组的数组大小表达式是 规范表达式 ,对于局部变量,这些表达式不需要是常量表达式。
在您的测试用例中,数组 num
是 mysubtest
的局部变量。 nod
是一个模块变量,可通过主机关联访问(并在该主机中使用关联),因此形成了一个非常有效的规范表达式:数组 num
的大小为 nod
in [=11] =],无论调用子例程时 nod
的值如何。
有关规范表达式中允许的内容的详细信息,请参见 Fortran 2018,10.1.11。
自动对象可能会出现在其他地方或由于数组大小以外的原因而自动,但这与问题的情况无关。