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

标签 fortran gfortran

我制作了这个小测试程序来“证明”如果在编译之前没有指定向量的大小(或者如果使它们可分配),则无法使用向量。但我的观点失败了。我预计本地向量“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

最佳答案

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

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

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

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

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

关于fortran - Fortran 数组边界检查的运行时检查未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59103036/

相关文章:

fortran - forall索引关联实体?

Fortran 奇怪的段错误

linux - 对 `blacs_gridinfo_' 的 undefined reference

python-2.7 - 数据交换——Python 和 Fortran

pointers - Fortran 中的故意类型不匹配

fortran - 宽度为零的格式描述符,如 F0.6 或 G0.8

arrays - 声明数组的不同语法 : with and without the dimension statement

arrays - 正确使用 Fortran 流写入和读取整数数组

optimization - 提高速度

constructor - 如何覆盖fortran中的结构构造函数