Fortran数组边界检查的运行时检查未触发

Fortran数组边界检查的运行时检查未触发,fortran,gfortran,Fortran,Gfortran,我制作这个小测试程序是为了“证明”在编译之前,如果不指定向量的大小(或者使它们可分配),就不能使用向量。但我的观点失败了。我原以为本地向量“num”会失败。在执行程序之前,程序无法知道它的大小。大小nod在执行时从用户处读取。我使用以下命令编译: gfortan-fcheck=所有测试。f90 执行期间,“nod”的值为500000000 gfortran的版本是6.3.0 执行“罚款”,并返回以下答案: 799000000000000490000000000004500000000 所以我的问

我制作这个小测试程序是为了“证明”在编译之前,如果不指定向量的大小(或者使它们可分配),就不能使用向量。但我的观点失败了。我原以为本地向量“num”会失败。在执行程序之前,程序无法知道它的大小。大小nod在执行时从用户处读取。我使用以下命令编译:

gfortan-fcheck=所有测试。f90

执行期间,“nod”的值为500000000

gfortran的版本是6.3.0

执行“罚款”,并返回以下答案:

799000000000000490000000000004500000000

所以我的问题是,;为什么编译器不向我抛出在(未定义的)向量之外编写的错误?我想它看到了我的错误,救了我??通过使其可分配??还是我完全错了

MODULE globaldata
  IMPLICIT NONE
  INTEGER nod
END MODULE globaldata



当然,可以有显式的形状数组,这些数组的大小在编译时是未知的(使用命名或文字常量/常量表达式)。这些实体称为自动对象。然而,它们在可能出现的地方受到限制

显式形状数组可以出现在任何程序单元的规范部分中。 主程序或模块范围内的变量的大小必须是常量表达式。更一般地说,显式大小数组的数组大小表达式是规范表达式,而对于局部变量,这些表达式不需要是常量表达式

在您的测试用例中,数组
num
mysubtest
的局部变量
nod
是一个模块变量,可通过主机关联(并在该主机中使用关联)访问,因此形成了一个非常有效的规范表达式:数组
num
mysubtest
中具有size
nod
,无论调用子例程时
nod
的值是多少

有关规范表达式中允许的内容的详细信息,请参见Fortran 2018,10.1.11


自动对象可能会出现在其他位置,或者由于数组大小以外的原因而自动,但这与问题的情况无关。

程序正常,我看不到任何错误。很可能是相关的。谢谢你的回答@francescalus!我只是在一个非常基本的层面上,但我会仔细阅读你的答案,特别是你对这个问题的评论中的链接。
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