调用带有可选参数的子例程时缺少实际参数

时间:2018-06-17 08:55:24

标签: fortran intel-fortran

我的IDE是带有集成英特尔Fortran编译器的Visual Studio 2010。编译器的版本是:Intel Parallel Studio XE 2011。

我在Fortran中没有经验丰富的程序员,所以我需要一些关于在派生类型的公共过程中使用可选参数的帮助。这是我的示例代码:

MODULE DERIVED_TYPE

 TYPE , PUBLIC :: SOME_TYPE

  INTEGER , PRIVATE :: V_INT

   CONTAINS

      PROCEDURE , PUBLIC :: CALL_V_INT => CALL_DATA_V_INT
      PROCEDURE , PUBLIC :: TAKE_V_INT => TAKE_DATA_V_INT

 END TYPE SOME_TYPE

 PRIVATE :: CALL_DATA_V_INT
 PRIVATE :: TAKE_DATA_V_INT

CONTAINS

! PUBLIC PROCEDURES

  SUBROUTINE CALL_DATA_V_INT( THIS , IA , IB , IC )

    CLASS( SOME_TYPE ) :: THIS
    INTEGER , INTENT( IN ) :: IA , IC
    INTEGER , INTENT( IN ) , OPTIONAL :: IB

    IF( .NOT. PRESENT( IB ) ) THEN

        THIS%V_INT = IA + IC

    ELSE

        THIS%V_INT = IA + IB + IC

    END IF

  END SUBROUTINE CALL_DATA_V_INT

  FUNCTION TAKE_DATA_V_INT ( THIS ) RESULT( RES )

    CLASS( SOME_TYPE ) :: THIS
    INTEGER :: RES

    RES = THIS%V_INT

  END FUNCTION TAKE_DATA_V_INT

END MODULE DERIVED_TYPE

PROGRAM OPTIONAL_ARG

USE , NON_INTRINSIC :: DERIVED_TYPE

IMPLICIT NONE

INTEGER :: I
INTEGER , PARAMETER :: N = 3

CLASS( SOME_TYPE ) , POINTER :: P_SOME_TYPE

TYPE( SOME_TYPE ) , DIMENSION( N ) , TARGET :: ARR_V_INT

DO I = 1 , N

   P_SOME_TYPE => ARR_V_INT( I )

   CALL P_SOME_TYPE%CALL_V_INT( I , 5 )

   WRITE( * , * ) P_SOME_TYPE%TAKE_V_INT()

END DO

END PROGRAM OPTIONAL_ARG

在编译过程结束时,我在构建窗口中收到了这样的消息: Missing actual argument for argument 'ic'

这个例子有什么问题?

我也尝试将可选参数移动到参数列表中的最新位置,在这种情况下没有错误消息。

我可以获得参数列表中可选参数位置的详细说明吗?

1 个答案:

答案 0 :(得分:3)

您通常应该尝试在参数列表的末尾添加可选参数。当你打电话时会发生什么?

  subroutine sub (a, b, c)
    real :: a, c
    real, optional :: b

  ...

  call sub(1.,2.)

是编译器必须假设1.用于a2.用于b。然后缺少c的参数。

相反,可以在缺少可选的

之后使用命名参数
  call sub(1, c=2.)

所以在你的情况下你可以做

CALL P_SOME_TYPE%CALL_V_INT( I , IC = 5 )

如果您不想在参数列表的末尾添加可选的IB