Arrays 子例程内部带有数组的循环

Arrays 子例程内部带有数组的循环,arrays,fortran90,subroutine,Arrays,Fortran90,Subroutine,我有一个关于fortran中子程序内部循环的问题 如果我把它作为子例程,那么我希望变量test变成一个从1到5的数组 p、 s.type3定义为real,维度(5,1) 然而,这是一个错误 ||Error: Rank mismatch in array reference (1/2)| 当我在测试%type3之后删除“(i)”时,它会工作,但结果是5.000 5.000 5.000 5.000 5.000 5.000。因此,它只将最后一个循环中的值分配给数组中的所有条目。 如果我删除

我有一个关于fortran中子程序内部循环的问题

如果我把它作为子例程,那么我希望变量test变成一个从1到5的数组

p、 s.
type3
定义为
real,维度(5,1)

然而,这是一个错误

    ||Error: Rank mismatch in array reference  (1/2)|
当我在测试%type3之后删除“(i)”时,它会工作,但结果是5.000 5.000 5.000 5.000 5.000 5.000。因此,它只将最后一个循环中的值分配给数组中的所有条目。 如果我删除了%test,程序就不知道变量test是什么类型了,它会给出

 ||Error: Unclassifiable statement  |

有人能告诉我我做错了什么吗?

你忘了用
测试%type3(i,1)=i分配吗

由于
type3
是一个2D数组,因此需要两个索引来分配值。当您键入
test%type3=i
时,您将同时为所有元素分配相同的值。这就是为什么最终您会得到所有
5.0


注:
ENDDO
语句在哪里?

Fortran 90有一个标记。您应该确保将来使用它(并且您不需要在标题中提及语言)。这是一个数组级别的广播问题
type3=i
会将所有数组元素设置为i,这就是为什么会得到所有5s(最后一次do循环迭代会覆盖以前的5s)。这样可以省略所有数组索引。但是你不能只忽略一些(比如秩2数组中的一个)。你可以做
test%type3(i,:)=i
(在上一个索引上广播)或
test%type3(i,1)=i
,但你不能只忽略数组索引-一般来说,没有办法知道你漏掉了哪些索引。哦,哇,就是这样。我只需要把(I)变成(I,1)。非常感谢(当我删除所有与此问题无关的代码时,EndDo语句意外地掉了下来)
 ||Error: Unclassifiable statement  |