【发布时间】:2014-05-08 08:00:36
【问题描述】:
注意:我仍在调查此问题 - 请不要调查 - 错误可能在其他地方
我希望子例程的参数是可选的,但该参数也恰好是假设形状数组。当我尝试编译包含此子例程的模块时,出现以下错误:
PGF90-S-0189-参数编号 3 到(例程):标量实际参数与数组虚拟参数(位置)的关联
例程如下所示:
SUBROUTINE EXAMPLE(A, B, C)
IMPLICIT NONE
INTEGER, INTENT(IN) :: A, B
INTEGER, OPTIONAL, DIMENSION(:), INTENT(IN) :: C
INTEGER :: TEST
IF (PRESENT(C)) THEN
TEST=C(1)
PRINT *,TEST
ELSE
PRINT *,A,B
ENDIF
END SUBROUTINE EXAMPLE
它包含在一个模块中。当我尝试从使用模块的子例程中仅使用两个参数调用它时出现错误。
我在 Portland Group 论坛上只发现了一个可能相关的问题:
http://www.pgroup.com/userforum/viewtopic.php?t=624&sid=d76fdf8ca2bf4fc3109f4f49b1de0ad7
答案归结为用户使用尚未分配的可选参数 - 我不知道这是否适用于我的情况,因为我没有在 IF(PRESENT(C)) 之外使用“C”块,但是在将变量定义为假定形状时是否会进行隐式分配,而如果一开始没有传递就无法执行?
【问题讨论】:
-
这不是确切的代码本身,我只是把它的本质作为一个简化的说明。我已将子例程重命名为EXAMPLE,以防止出现名称冲突。
-
没有完全禁止将
optional与假定形状的假人一起使用。这并不是说所有用途都是正确的,那么您能否为您的问题案例提供MCVE? -
您报告的错误消息与可选或假定形状无关 - 它抱怨您将标量传递给数组参数,这是标准不允许的(有一些例外。)我在software.intel.com/en-us/blogs/2009/03/31/… 中讨论这个问题。由于您没有向我们展示电话,因此很难更具体。
-
感谢您的回复,我将添加其他详细信息,包括我不在途中时的通话。
-
我刚刚编写了实际代码的简化版本,现在它似乎可以正常工作,所以我怀疑这个问题不是我最初想的那样。当我有的时候,我会做更多的调查和更新。
标签: fortran fortran90 optional