【问题标题】:Assignment of rank1 array in fortranfortran中rank1数组的赋值
【发布时间】:2011-03-22 01:41:10
【问题描述】:

每当我编译以下 fortran 代码时:

program test
    implicit none
    integer     :: temp(1),i
    integer     :: z(1:10) = [(i,i=1,10)]

    temp(1) = 10
    z(2)    = temp

end program test

我收到错误:错误 #6366:数组表达式的形状不符合 如果我换行:

z(2)    = temp

z(2)    = temp(1)

它编译并运行良好。为什么不能将单个元素数组分配给另一个数组的元素而不必显式列出该元素。我问这个是因为一些内在函数,如 minloc 和 pack 返回排名 1 的值。例如: z(i) = minloc(z) 产生同样的错误。

【问题讨论】:

    标签: arrays fortran variable-assignment


    【解决方案1】:

    为什么不能分配单个元素 数组到另一个数组的元素 无需明确列出 元素。

    根据 Fortran 标准,数组等级在分配时应该是兼容的。您可以在该文档中找到兼容性的定义。例如,在 Fortran 2003 标准中,7.4.1.2 内部赋值语句

    部分

    (2) 任何一个变量都应该是与 expr 相同等级的可分配数组或 变量和 expr 应符合

    2.4.5 Array 节为我们提供了定义:

    一个数组最多可以有七个维度,以及任何维度中的任何范围(元素数量)。 数组的秩是维数;它的大小是元素的总数,即 等于范围的乘积。数组的大小可能为零。确定数组的形状 通过其在每个维度中的等级和范围,并且可以表示为一个等级为一的数组,其元素 是范围。
    [...]
    如果两个数组具有相同的形状,则它们是一致的。

    现在看看你的代码。 z(2) 是标量。它的等级是 0。它的形状是零大小的数组。 temp 是秩为 1 且形状为 [1] 的数组。形状不同。这两个实体不相容。

    但如果你愿意,你可以制作它们。您可以使用数组部分:

    z(2:2)    = temp
    

    现在两个实体的形状都是 [1]。

    【讨论】:

      猜你喜欢
      • 2023-01-27
      • 1970-01-01
      • 2012-02-08
      • 2015-12-21
      • 1970-01-01
      • 2013-12-02
      • 2013-10-07
      • 1970-01-01
      • 2021-08-15
      相关资源
      最近更新 更多