gpt4 book ai didi

fortran - 使用可选参数调用子例程时缺少实际参数

转载 作者:行者123 更新时间:2023-12-02 20:22:49 24 4
gpt4 key购买 nike

我的 IDE 是带有集成 Intel Fortran 编译器的 Visual Studio 2010。编译器版本为: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

在编译过程结束时,我在构建窗口中收到此类消息:缺少参数“ic”的实际参数

这个例子有什么问题吗?

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

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

最佳答案

您通常应该尝试将可选参数放在参数列表的末尾。当你打电话时会发生什么,例如

  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

关于fortran - 使用可选参数调用子例程时缺少实际参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com