在fortran中分配rank1数组

1 arrays fortran variable-assignment

每当我编译以下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
Run Code Online (Sandbox Code Playgroud)

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

z(2)    = temp
Run Code Online (Sandbox Code Playgroud)

z(2)    = temp(1)
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*cat 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
Run Code Online (Sandbox Code Playgroud)

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