【发布时间】:2011-03-09 19:21:46
【问题描述】:
根据 Fortran 标准信息,我可以找到 (F77,F90/95) 一个没有下限的数组声明器假定此下限为 1。因为上限需要大于或等于下限绑定,这将不允许以下语句:
INTEGER A(0)
但是,我不能让 ifort 或 gfortran 以任何方式抱怨该声明。编译器是否不需要将其标记为错误?
【问题讨论】:
标签: fortran
根据 Fortran 标准信息,我可以找到 (F77,F90/95) 一个没有下限的数组声明器假定此下限为 1。因为上限需要大于或等于下限绑定,这将不允许以下语句:
INTEGER A(0)
但是,我不能让 ifort 或 gfortran 以任何方式抱怨该声明。编译器是否不需要将其标记为错误?
【问题讨论】:
标签: fortran
由于上界需要大于或等于下界,这将使得下面的语句不被允许。
来自 Fortran 2008 标准:
5.3.8.2 显式数组
[...] 3 每个下限和上限的值确定数组沿特定维度的边界,从而确定数组在该维度中的范围。如果出现下限,则它与下限相匹配;否则下限为 1。下限或上限的值可以是正数、负数或零。该维度中数组的下标范围是介于下限和上限之间(包括下限和上限)的整数值的集合,前提是上限不小于下限。 如果上限小于下限,则范围为空,该维度的范围为零,数组大小为零。
【讨论】:
自从我编写 fortran 代码已经有一段时间了,但我似乎记得如果只提供一个数字,它会给出数组的 length(下限和上限隐式变为 1 和length)。所以你的代码创建了一个长度为零的数组。
【讨论】:
INTEGER A(1:0),但我的问题是编译器不介意。甚至INTEGER A(10:0) 也被接受。唯一的问题是当你尝试访问这样一个数组时,它总是会给出一个越界错误。
INTEGER A(lower, upper) 想象为“A 是一个数组,其中没有低于lower 的索引是合法的,并且没有高于upper 的索引是合法的”。如您所说,如果lower > upper,则没有索引是合法的。但是,拥有零长度数组有完全正当的理由。考虑例如一个以整数数组作为参数的函数,应该返回满足特定条件的所有整数。如果没有找到这样的整数,则返回一个长度为零的数组是很自然的事情。