【发布时间】:2018-06-27 03:12:23
【问题描述】:
我需要一些关于使用继承规则的帮助。我的意图是使用一个派生类型数组来存储计算结果,但我也想使用该数组来存储来自主要派生类型和扩展派生类型的组件值。 例如,这是我要转换的示例代码:
MODULE DERIVED_TYPES
IMPLICIT NONE
! FIRST DERIVED TYPE
TYPE, PUBLIC :: DT_AA
INTEGER, PRIVATE :: I_AA
CONTAINS
PROCEDURE, PUBLIC:: CALCULATE => CALC_DATA_I_AA
PROCEDURE, PUBLIC:: T_I_AA => TAKE_DATA_I_AA
END TYPE DT_AA
PRIVATE :: CALC_DATA_I_AA
PRIVATE :: TAKE_DATA_I_AA
! SECOND DERIVED TYPE
TYPE, EXTENDS( DT_AA ), PUBLIC :: DT_BB
INTEGER, PRIVATE :: I_BB
CONTAINS
PROCEDURE, PUBLIC:: CALCULATE => CALC_DATA_I_BB
PROCEDURE, PUBLIC:: T_I_BB => TAKE_DATA_I_BB
END TYPE DT_BB
PRIVATE :: CALC_DATA_I_BB
PRIVATE :: TAKE_DATA_I_BB
CONTAINS
! TYPE DT_AA PROCEDURES
SUBROUTINE CALC_DATA_I_AA( THIS, INDX )
CLASS( DT_AA ) :: THIS
INTEGER, INTENT( IN ) :: INDX
THIS%I_AA = 1 + INDX
END SUBROUTINE CALC_DATA_I_AA
FUNCTION TAKE_DATA_I_AA( THIS ) RESULT( VALUE_I_AA )
CLASS( DT_AA ) THIS
INTEGER :: VALUE_I_AA
VALUE_I_AA = THIS%I_AA
END FUNCTION TAKE_DATA_I_AA
! TYPE DT_BB PROCEDURES
SUBROUTINE CALC_DATA_I_BB( THIS, INDX )
CLASS( DT_BB ) :: THIS
INTEGER, INTENT( IN ) :: INDX
THIS%I_BB = THIS%I_AA + INDX
END SUBROUTINE CALC_DATA_I_BB
FUNCTION TAKE_DATA_I_BB( THIS ) RESULT( VALUE_I_BB )
CLASS( DT_BB ) THIS
INTEGER :: VALUE_I_BB
VALUE_I_BB = THIS%I_BB
END FUNCTION TAKE_DATA_I_BB
END MODULE DERIVED_TYPES
PROGRAM INHERITANCE_RULE
USE, NON_INTRINSIC :: DERIVED_TYPES
IMPLICIT NONE
INTEGER :: I
INTEGER, PARAMETER :: N_CALC = 3
CLASS( DT_AA ), POINTER :: P_INH
TYPE( DT_AA ), TARGET :: P_A_INH( N_CALC )
DO I = 1, N_CALC
P_INH => P_A_INH( I )
CALL P_INH%CALCULATE( I )
WRITE(*,*) P_INH%T_I_AA(), P_INH%T_I_BB()
END DO
END PROGRAM INHERITANCE_RULE
在这种情况下,我不能使用指针 P_INH 和函数来获取不是扩展派生类型成员的组件 I_BB 值,因为我收到了以下编译错误消息:
't_i_bb' is not a member of the 'dt_aa' structure
哪种更改对这种情况有用?
我的 IDE 是带有 Gfortran 编译器的 Code::Blocks 17.12。编译器版本为:MinGW 6.3.0。
【问题讨论】:
-
@HighPerformanceMark 我想同时对两个结构进行计算,我想通过函数取值。有没有办法做到这一点?
-
有什么用?修复错误信息?还是为了实现别的目标?
-
@VladimirF 我可以通过声明不同的数组来修复错误,但在这种情况下,我将无法获得
I_AA的正确结果。 -
您希望/希望
I_AA和I_BB的值在您的循环之后? -
@ptb 我想得到这个结果
[2,3], [3,4], [5,6],我想把这些结果存储在数组P_A_INH