Fortran数组范围检查的运行时检查未触发
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fortran数组范围检查的运行时检查未触发相关的知识,希望对你有一定的参考价值。
我制作了这个小型测试程序,以“证明”在编译前(或者如果您可以分配它们的情况下)未指定向量的大小就无法使用它们。我的观点虽然失败了。我期望本地向量“ 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
答案
当然可以具有显形数组,其大小在编译时未知(使用命名/文字常量)。所谓的自动对象具有此属性。
显形数组可以出现在程序单元的任何规范部分中。实际上,主程序或模块范围内的变量必须具有为常量表达式的大小。但是,对于局部变量,大小表达式可以改为规格表达式。这些不必是常量表达式。
在您的测试用例中,数组num
是mysubtest
的局部变量。 nod
是一个模块变量,可以通过主机关联进行访问,因此形成了一个非常有效的规范表达式:num
中的数组nod
的大小为mysubtest
,无论调用子例程时nod
的值如何。
以上是关于Fortran数组范围检查的运行时检查未触发的主要内容,如果未能解决你的问题,请参考以下文章