条件fortran记录变量选择

时间:2017-06-07 18:52:27

标签: fortran

我定义了一个结构:

STRUCTURE /IOA/
  INTEGER*2 ID
  .....
END STRUCTURE

我需要创建另一个结构IOB。 IOB包含与IOA相同的所有字段,但还有更多字段。

STRUCTURE /IOB/
  INTEGER*2 ID
  .....
END STRUCTURE

我的计划目前有:

RECORD /IOA/ A
RECORD /IOB/ B

程序将根据用户输入使用A或B.

有没有办法在代码中使用某种条件来使用A或B,具体取决于所需的内容?例如,是否可以创建一个占位符记录(变量?)" IO"并根据输入来定义它:

If user input = 1, IO = A
else IO = B
.....

IO.ID = 30

谢谢。

2 个答案:

答案 0 :(得分:3)

现代Fortran(2003及更高版本)中的多态性是什么。

   use iso_fortran_env, only: int16

   implicit none

    type IOA
      integer(int16) :: ID
    end type


    type, extends(IOA) :: IOB
      integer :: extendedID
    end type

    class(IOA), allocatable :: IO

    integer :: user_input = 2

    if (user_input == 1) then
      allocate(IOA :: IO)
    else
      allocate(IOB :: IO)
    end if

    IO%ID = 30

    select type (IO)
      type is (IOB)
        IO%extendedID = 42
      class default !just an illustration
        continue
    end select
end

您无法使用过时的DEC扩展STRUCTURE和RECORD执行此操作。建议不要使用这些扩展。它们不是标准Fortran的一部分。

答案 1 :(得分:0)

我的建议是在模块中创建类型IO_TYPE,并让它包含一个类型的指针,其中包含您可能需要或可能不需要的额外内容:

MODULE IO_TYPES
  TYPE EXTRA_STUFF
     INTEGER :: AGE
     INTEGER :: HEIGHT
     INTEGER :: WIEGHT
  END type EXTRA_STUFF
  TYPE IO_TYPE
     INTEGER :: ID
     TYPE(EXTRA_STUFF), POINTER :: EXT
  END type IO_TYPE

END MODULE IO_TYPES

然后,在您的程序中,当然会有USE IO_TYPES,您可以决定是否分配该指针:

TYPE (IO_TYPE) :: IO
INTEGER        :: IERR_ALLOC

IF ( USER_INPUT .EQ. 1 ) ALLOCATE( IO%EXT, STAT=IERR_ALLOC )
IF ( IERR_ALLOC .NE. 0 ) STOP 1

(始终检查ALLOCATE语句的结果。)