Fortran 使用类型过程获取派生类型的数组组件的单个值

Fortran 使用类型过程获取派生类型的数组组件的单个值,fortran,gfortran,Fortran,Gfortran,我的IDE是Code::Blocks 17.2和编译器GFortran 6.3.1 代码是: MODULE CLASS_BRANCHES IMPLICIT NONE TYPE , PUBLIC :: TS_SHIR PRIVATE COMPLEX , ALLOCATABLE :: Y_BRA (:) CONTAINS PROCEDURE , PUBLIC :: CALCULATION_TS_SHIR => CALCULATION_DA

我的IDE是Code::Blocks 17.2和编译器GFortran 6.3.1

代码是:

MODULE CLASS_BRANCHES

IMPLICIT NONE

  TYPE , PUBLIC :: TS_SHIR

    PRIVATE

      COMPLEX , ALLOCATABLE :: Y_BRA (:)

    CONTAINS

      PROCEDURE , PUBLIC :: CALCULATION_TS_SHIR => CALCULATION_DATA_TS_SHIR
!      PROCEDURE , PUBLIC :: TAKE_Y_BRA => TAKE_DATA_Y_BRA

  END TYPE TS_SHIR

  PRIVATE :: CALCULATION_DATA_TS_SHIR
!  PRIVATE :: TAKE_DATA_Y_BRA

CONTAINS

SUBROUTINE CALCULATION_DATA_TS_SHIR( THIS , N_BRA )

  IMPLICIT NONE

  CLASS ( TS_SHIR ) , INTENT( INOUT ) :: THIS
  INTEGER , INTENT ( IN ) :: N_BRA
  INTEGER :: I , ALLOC_ERR

  IF ( .NOT. ALLOCATED ( THIS%Y_BRA ) ) ALLOCATE ( THIS%Y_BRA ( N_BRA ) , STAT = ALLOC_ERR )

  IF ( ALLOC_ERR .NE. 0 ) STOP ("MEMORY ALLOCATION PROBLEM - THIS%Y_BRA!")

  DO I = 1 , N_BRA

     THIS%Y_BRA(I) = CMPLX ( 11 + I , 12 + I )

  END DO

RETURN
END SUBROUTINE CALCULATION_DATA_TS_SHIR

!FUNCTION TAKE_DATA_Y_BRA ( THIS ) RESULT ( DATA_Y_BR )
!
!    IMPLICIT NONE
!
!    CLASS ( TS_SHIR ) :: THIS
!    COMPLEX :: DATA_Y_BR
!
!    DATA_Y_BR = THIS%Y_BRA
!
!RETURN
!END FUNCTION TAKE_DATA_Y_BRA

END MODULE CLASS_BRANCHES

PROGRAM TYPE_ALLOCATABLE_ARRAY

USE , NON_INTRINSIC :: CLASS_BRANCHES

IMPLICIT NONE

INTEGER :: I , J
INTEGER , PARAMETER :: N_BRANCHES = 5 , N_CALCULATIONS = 6
CHARACTER( 250 ) , DIMENSION ( N_CALCULATIONS ) :: UN_NAME
CHARACTER(*) , PARAMETER :: UN_FMT = '("OUTPUT_",I2.2,".TXT")'  

CLASS ( TS_SHIR ) , POINTER :: P_BRA
TYPE ( TS_SHIR ) , DIMENSION ( N_CALCULATIONS ) , TARGET :: BRANCHES  

LOOP_00: DO I = 1 , N_CALCULATIONS

            P_BRA => BRANCHES(I)

            CALL P_BRA%CALCULATION_TS_SHIR( N_BRANCHES )

            WRITE( UN_NAME(I) , UN_FMT ) I

            OPEN ( 15 , FILE = UN_NAME(I) , STATUS = 'UNKNOWN' , ACTION = 'WRITE' )

              DO J = 1 , N_BRANCHES

                 WRITE( 15 , * ) J ! HOW TO WRITE VALUES OF Y_GRA( N_BRA ) WITH MEMBER FUNCTION OF TYPE TS_SHIR???

              END DO

            CLOSE ( 15 , STATUS = 'KEEP')

         END DO LOOP_00

END PROGRAM TYPE_ALLOCATABLE_ARRAY
我是Fortran面向对象编程的新手,所以我需要解释一下如何通过公共过程获取
类型
私有成员(可分配数组)的值
TAKE\Y\u BRA
。我对函数体进行了注释,因为我收到了他的信息:
分配中不兼容的秩0和1
在该命令的第行:
DATA\u Y\u BR=此%Y\u BR

是否有任何解决方案,或者对于这种使用派生类型的计算,我有一种完全错误的方法?

或者返回整个数组

FUNCTION TAKE_DATA_Y_BRA ( THIS ) RESULT ( DATA_Y_BR )
   CLASS ( TS_SHIR ) :: THIS
   COMPLEX :: DATA_Y_BR(SIZE(THIS%Y_BRA))

   DATA_Y_BR = THIS%Y_BRA
END FUNCTION TAKE_DATA_Y_BRA
或者在索引
J处返回一个元素

FUNCTION TAKE_DATA_Y_BRA_J ( THIS, J ) RESULT ( DATA_Y_BR )
   CLASS ( TS_SHIR ) :: THIS
   INTEGER, INTENT(IN) :: J
   COMPLEX :: DATA_Y_BR

   DATA_Y_BR = THIS%Y_BRA(J)
END FUNCTION TAKE_DATA_Y_BRA_J

注意,您实际上并不需要
隐式无
返回
。简明扼要。你的代码很难读!使用小写字母以提高可读性。

@VladimirF模块位于单独的文件中。您必须告诉我们
TAKE_DATA_Y_BRA
的权限。我不明白。它应该返回哪个值?数组中的哪个元素?还是完整数组?错误消息(正确)表示您试图将数组分配给标量的位置。我也看不出您想要做什么,所以无法告诉您如何解决这个问题,只是您需要解决它。@VladimirF在函数体
TAKE_DATA\u Y_BRA
返回值的类型很复杂。在主程序中,我想把数组的元素
Y\u BRA
写在同一行的
J
之后。但是哪个元素呢?整个数组,还是第一个值,还是哪一个?数组中有
N个
元素。您只返回一个号码。