在子程序中传递的排名值

rank values passed in subroutines

我在编写的一些 Fortran 代码中使用多维数组时遇到一些问题。

基本上,我定义了一个二维数组,传递给membrane,然后必须将它的一维版本传递给set

Case (1)
  Call membrane ("Set", scv(i,:), sty)

这是获取一维数组的例程。

Subroutine membrane (tsk, scv, sty)
Implicit None
Character (Len=*), Intent (In) :: tsk
Logical, Intent (In), Optional :: scv(:,:)
Character (Len=*), Intent (In), Optional :: sty

Select Case (tsk)

Case ("Set")
  Call set (tsk, scv(1,:), sty) 

...

这是我设置的子程序

Subroutine set (tsk, scv, sty)

Implicit None
Character (Len=*), Intent (In) :: tsk
Logical, Intent (In), Optional :: scv(:)
Character (Len=*), Intent (In), Optional :: sty

然后当我尝试编译我的代码时出现此错误

sct/btun/membrane.f:185:35:

     Call membrane ("Set", scv(i,:), sty)
                               1
Error: Rank mismatch in argument 'scv' at (1) 
(rank-2 and rank-1)

"then have to pass a 1-dimensional version of it to set"

但是子例程需要一个二维数组,因为

Logical, Intent (In), Optional :: scv(:,:)

要么修改声明,要么必须传递一个二维数组。

您正在使用 scv 的一维切片调用例程 membrane。由于该子例程需要一个二维数组:

Logical, Intent (In), Optional :: scv(:,:)

你得到了错误。我不太确定你想要实现什么,但由于你正在访问膜中数组的第一列(硬编码),我会将虚拟参数 scv 更改为 [= 中的一维12=]:

Subroutine membrane (tsk, scv, sty)
...
Logical, Intent (In), Optional :: scv(:)
...

Select Case (tsk)

Case ("Set")
  Call set (tsk, scv(:), sty) 
...

请注意,现在完整的数组已传递给 set

或者,将完整的二维数组与计数器 i 一起传递给 membrane,并将第 i 行传递给 set