【问题标题】:Array declarator in Fortran with no lower bound and upper bound 0Fortran 中的数组声明符,没有下限和上限 0
【发布时间】:2011-03-09 19:21:46
【问题描述】:

根据 Fortran 标准信息,我可以找到 (F77,F90/95) 一个没有下限的数组声明器假定此下限为 1。因为上限需要大于或等于下限绑定,这将不允许以下语句:

INTEGER A(0)

但是,我不能让 ifort 或 gfortran 以任何方式抱怨该声明。编译器是否不需要将其标记为错误?

【问题讨论】:

    标签: fortran


    【解决方案1】:

    由于上界需要大于或等于下界,这将使得下面的语句不被允许。

    来自 Fortran 2008 标准:

    5.3.8.2 显式数组
    [...] 3 每个下限和上限的值确定数组沿特定维度的边界,从而确定数组在该维度中的范围。如果出现下限,则它与下限相匹配;否则下限为 1。下限或上限的值可以是正数、负数或零。该维度中数组的下标范围是介于下限和上限之间(包括下限和上限)的整数值的集合,前提是上限不小于下限。 如果上限小于下限,则范围为空,该维度的范围为零,数组大小为零。

    【讨论】:

    • 谢谢!但是,我没有在我查找的 F77 和 F90/95 规范中找到最后一句话……好吧,我会接受这个作为答案,假设它并不太重要,而且显然在后来的标准中这是允许的。
    • 它在 F90 和 F95 中。只有 F77 明确禁止上限小于下限。
    • Thnx,那么我的消息来源毕竟只提到了 F77。不过,带有 -std=legacy 的 gfortran 不会抱怨。
    • 那是因为 -std=legacy 没有指定 F77。来自文档:“std 的默认值是 'gnu',它指定了 Fortran 95 标准的超集,其中包括 GNU Fortran 支持的所有扩展,尽管对于不建议在新代码中使用的过时扩展会给出警告. 'legacy' 值是等效的,但没有过时扩展的警告,并且可能对旧的非标准程序有用。”
    【解决方案2】:

    自从我编写 fortran 代码已经有一段时间了,但我似乎记得如果只提供一个数字,它会给出数组的 length(下限和上限隐式变为 1 和length)。所以你的代码创建了一个长度为零的数组。

    【讨论】:

    • 是的,这确实意味着我的声明等同于INTEGER A(1:0),但我的问题是编译器不介意。甚至INTEGER A(10:0) 也被接受。唯一的问题是当你尝试访问这样一个数组时,它总是会给出一个越界错误。
    • @steabert:我明白你的意思,因为等价性成立。但是您可以尝试将INTEGER A(lower, upper) 想象为“A 是一个数组,其中没有低于lower 的索引是合法的,并且没有高于upper 的索引是合法的”。如您所说,如果lower > upper,则没有索引是合法的。但是,拥有零长度数组有完全正当的理由。考虑例如一个以整数数组作为参数的函数,应该返回满足特定条件的所有整数。如果没有找到这样的整数,则返回一个长度为零的数组是很自然的事情。
    • 如果只给出一个数字,我认为将其视为指定长度是不正确的。这个数字也可能是负数。
    • @eriktous 和@steabert:很公平;我认为将其解释为上限可能更合理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多