在子程序中传递的排名值
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
。
我在编写的一些 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
。