使用可选参数调用子例程时缺少实参
Missing actual argument when calling a subroutine with optional arguments
我的 IDE 是 Visual Studio 2010,带有集成的 Intel Fortran 编译器。编译器版本为:Intel Parallel Studio XE 2011.
我在 Fortran 方面不是经验丰富的程序员,所以我需要一些关于在派生类型的 public 过程中使用可选参数的帮助。这是我的示例代码:
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
在编译过程结束时,我在构建 window 中收到了此类消息:
Missing actual argument for argument 'ic'
这个例子有什么问题?
我还尝试将可选参数移动到参数列表中的最新位置,这样就不会出现错误消息。
我可以得到参数列表中可选参数位置的详细解释吗?
您通常应该尝试将可选参数放在参数列表的末尾。当您调用
时会发生什么
subroutine sub (a, b, c)
real :: a, c
real, optional :: b
...
call sub(1.,2.)
是编译器必须假定 1.
用于 a
而 2.
用于 b
。然后缺少 c
的参数。
相反,可以在缺少的可选参数之后使用命名参数
call sub(1, c=2.)
所以在你的情况下你可以这样做
CALL P_SOME_TYPE%CALL_V_INT( I , IC = 5 )
如果您不想在参数列表的末尾有可选的 IB
。
我的 IDE 是 Visual Studio 2010,带有集成的 Intel Fortran 编译器。编译器版本为:Intel Parallel Studio XE 2011.
我在 Fortran 方面不是经验丰富的程序员,所以我需要一些关于在派生类型的 public 过程中使用可选参数的帮助。这是我的示例代码:
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
在编译过程结束时,我在构建 window 中收到了此类消息:
Missing actual argument for argument 'ic'
这个例子有什么问题?
我还尝试将可选参数移动到参数列表中的最新位置,这样就不会出现错误消息。
我可以得到参数列表中可选参数位置的详细解释吗?
您通常应该尝试将可选参数放在参数列表的末尾。当您调用
时会发生什么 subroutine sub (a, b, c)
real :: a, c
real, optional :: b
...
call sub(1.,2.)
是编译器必须假定 1.
用于 a
而 2.
用于 b
。然后缺少 c
的参数。
相反,可以在缺少的可选参数之后使用命名参数
call sub(1, c=2.)
所以在你的情况下你可以这样做
CALL P_SOME_TYPE%CALL_V_INT( I , IC = 5 )
如果您不想在参数列表的末尾有可选的 IB
。