【问题标题】:Declaring array-spec in the dimension attr-spec and in entity-decl at the same time同时在维度 attr-spec 和 entity-decl 中声明 array-spec
【发布时间】:2019-08-04 14:47:25
【问题描述】:

此代码在 gfortran、Intel Fortran 和 Solaris Studio 中编译

  real, dimension(:) :: A(2)
  print *, size(A)
end

结果是 2。

但是,当在维度语句中尝试另一个 array-spec 时

  dimension A(1)
  real :: A(2)
  print *, size(A)
end

所有三个编译器都会发出一个错误,即维度属性被赋予了两次。

第一个代码标准是否符合标准?该标准(尽可能最新)对这种情况有什么具体说明?

【问题讨论】:

    标签: arrays fortran language-lawyer gfortran intel-fortran


    【解决方案1】:

    标准说:

    • 在确定语句指定的内容时,类型声明语句中实体的数组规范会覆盖同一语句中的任何 DIMENSION(...) 属性规范 (F2018 8.2p2)作为实体的属性。

    • 一个属性不能被指定两次 (F2018 C815)。

    第一个程序符合标准,行为符合标准;鉴于 C815,第二个不是。

    这些规则从 Fortran 90 开始就适用。C815 的等价物也在 F77 中,F66 的特征是模棱两可...

    【讨论】:

    • OP 使用的语法似乎是合法的:real,dimension(:) :: A(2)。但我很惊讶real,dimension(whatever,whatever,whatever...) :: A(2) 甚至可以编译。我想知道您是否可以提供一些见解,说明这种行为何时以及为什么可能是好的或有用的?
    • @MattP 至少当没有声明任何内容并且没有指定隐含内容时它会抱怨。
    • 但是,real, dimension(1000.,1000.,1000.,1000.) :: A(2) 被 Intel 和 gfortran 允许,被 Oracle 拒绝。我不知道哪个是正确的。
    • @VladimirF, real, dimension(1000.,1000.,1000.,1000.) :: A(2) 不是有效的 Fortran 声明语句。属性规范中的数组边界必须是有效的规范表达式,即使它们后来被覆盖。
    • @francescalus 实际上,gfortran v. 6 及更高版本也确实拒绝了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多