每当我编译以下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)产生相同的错误。
答案 0 :(得分:9)
为什么不能分配单个元素 数组到另一个数组的元素 无需明确列出 元件。
根据Fortran标准,数组排名应该与赋值兼容。您可以在该文档中找到兼容性的定义。例如,在Fortran 2003 Standard中, 7.4.1.2内部赋值语句
部分(2)任何一个变量都应该是与expr相同等级的可分配数组或者形状 变量和expr应符合
和 2.4.5数组为我们提供了定义:
数组最多可包含七个维度,以及任何维度的任何范围(元素数量)。 数组的等级是维数;它的大小是元素的总数,即 等于范围的乘积。数组可以具有零大小。确定阵列的形状 通过其在每个维度中的等级和范围,并且可以表示为其元素的排名一数组 是范围。
[...]
如果两个阵列具有相同的形状,则它们是一致的。
现在看看你的代码。 z(2)是标量。它的等级为0.它的形状是零大小的数组。 temp是具有等级1和形状[1]的数组。形状不同。这两个实体不一致。
但如果你愿意,你可以制作它们。您可以使用数组部分:
z(2:2) = temp
现在两个实体的形状都是[1]。