gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:57:10 39 4
gpt4 key购买 nike

我制作了这个小型测试程序来“证明”在编译之前(或者如果你让它们可分配),你不能在不指定它们的大小的情况下使用向量。我的观点失败了。我期待本地向量“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

最佳答案

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

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

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

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

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

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

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com