【问题标题】:Can a Fortran 90 assumed shape array be an OPTIONAL argument?Fortran 90 假定形状数组可以是可选参数吗?
【发布时间】: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


【解决方案1】:

这个问题现在已经解决了——你确实可以使用假定的形状数组作为可选参数。正如 cmets 中所指出的 - 错误源于旧版本的源文件,由于错误,预处理步骤未重新生成该源文件。结果,调用不是我想象的那样——它实际上包含一个整数作为第三个参数。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多