我需要一些有关使用子模块的帮助。我的目的是使用一个子模块来表示来自父模块的特定派生类型,并且我想将派生类型的整个声明放入子模块中。例如,这是我想要转换的示例代码:
MODULE PARENT_MODULE
IMPLICIT NONE
TYPE , PUBLIC :: DERIVED_TYPE_A
PRIVATE
INTEGER :: I_00
CONTAINS
PROCEDURE , PUBLIC :: CALC_I_00 => CALC_DATA_I_00
PROCEDURE , PUBLIC :: TAKE_I_00 => TAKE_DATA_I_00
END TYPE DERIVED_TYPE_A
PRIVATE :: CALC_DATA_I_00
PRIVATE :: TAKE_DATA_I_00
INTERFACE
MODULE SUBROUTINE CALC_DATA_I_00( THIS , NUM_00 )
CLASS( DERIVED_TYPE_A ) :: THIS
INTEGER , INTENT( IN ) :: NUM_00
END SUBROUTINE CALC_DATA_I_00
MODULE FUNCTION TAKE_DATA_I_00( THIS ) RESULT( RES )
CLASS( DERIVED_TYPE_A ) :: THIS
INTEGER :: RES
END FUNCTION TAKE_DATA_I_00
END INTERFACE
END MODULE PARENT_MODULE
SUBMODULE( PARENT_MODULE ) TYPE_A
CONTAINS
MODULE PROCEDURE CALC_DATA_I_00
THIS%I_00 = NUM_00 + 2
END PROCEDURE CALC_DATA_I_00
MODULE PROCEDURE TAKE_DATA_I_00
RES = THIS%I_00
END PROCEDURE TAKE_DATA_I_00
END SUBMODULE TYPE_A
PROGRAM TYPE_SUBMODULES
USE , NON_INTRINSIC :: PARENT_MODULE
IMPLICIT NONE
INTEGER :: I
CLASS( DERIVED_TYPE_A) , POINTER :: P_ARR_INT
TYPE( DERIVED_TYPE_A ) , DIMENSION( 3 ) , TARGET :: ARR_INT
D00: DO I = 1 , 3
P_ARR_INT => ARR_INT( I )
CALL P_ARR_INT%CALC_I_00( I )
WRITE( * , * ) ARR_INT( I )%TAKE_I_00()
END DO D00
END PROGRAM TYPE_SUBMODULES
有没有办法在子模块中使用派生类型(带有组件和过程)?例如,这样:
SUBMODULE( PARENT_MODULE ) TYPE_A
TYPE :: D_TYPE_A
INTEGER :: I_00
CONTAINS
! PROCEDURE :: CALC_I_00 => CALC_DATA_I_00
! PROCEDURE :: TAKE_I_00 => TAKE_DATA_I_00
END TYPE D_TYPE_A
CLASS( D_TYPE_A ) , POINTER :: P_ARR_INT
TYPE( DERIVED_TYPE_A ) , DIMENSION( 3 ) , TARGET :: ARR_INT
CONTAINS
!MODULE SUBROUTINE CALC_DATA_I_00( THIS )
!
! CLASS( D_TYPE_A ) :: THIS
! ! INTEGER , INTENT( IN ) :: NUM_00
!
! THIS%I_00 = NUM_00 + 1
!
!END SUBROUTINE CALC_DATA_I_00
!
!!FUNCTION TAKE_DATA_I_00( THIS ) RESULT( RES_00 )
!!
!! CLASS( D_TYPE_A ) :: THIS
!! INTEGER :: RES_00
!!
!! RES_00 = THIS%I_00
!!
!!END FUNCTION TAKE_DATA_I_00
END SUBMODULE TYPE_A
在这种情况下,我不能在主程序中使用指针和目标变量,我想这样做,或者是否可以在中声明指针和目标变量PARENT_MODULE
.
我的 IDE 是带有 Gfortran 编译器的 Code::Blocks 17.12。编译器版本为:MinGW 6.3.0。