【问题标题】:Run-time check on Fortran array bounds check not triggeringFortran 数组边界检查的运行时检查未触发
【发布时间】:2019-11-29 10:28:49
【问题描述】:

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

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】:

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

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

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

可以在 Fortran 2018, 10.1.11 中找到规范表达式中允许的内容的详细信息。

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

【讨论】:

  • 感谢@francescalus 的回答!我只是处于非常基本的水平,但我会阅读您的答案,特别是您对该问题的评论中的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2012-03-07
相关资源
最近更新 更多