Fortran数组范围检查的运行时检查未触发

问题描述 投票:0回答:1

我制作了这个小型测试程序,以“证明”在编译前(或者如果您可以分配它们的情况下)未指定向量的大小就无法使用它们。我的观点虽然失败了。我期望本地向量“ num”会失败。在执行程序之前,程序无法知道其大小。大小点头是在执行时从用户读取的。我用以下命令编译:

gfortan -fcheck = all test.f90

执行过程中,“ nod”的值为500000000

gfortran的版本是6.3.0

执行成功,并返回以下答案:

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
fortran gfortran
1个回答
0
投票

当然可以具有显形数组,其大小在编译时未知(使用命名/文字常量)。所谓的自动对象具有此属性。

显形数组可以出现在程序单元的任何规范部分中。实际上,主程序或模块范围内的变量必须具有为常量表达式的大小。但是,对于局部变量,大小表达式可以改为规格表达式。这些不必是常量表达式。

在您的测试用例中,数组nummysubtest的局部变量。 nod是一个模块变量,可以通过主机关联进行访问,因此形成了一个非常有效的规范表达式:num中的数组nod的大小为mysubtest,无论调用子例程时nod的值如何。

© www.soinside.com 2019 - 2024. All rights reserved.