我定义了一个结构:
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
谢谢。
答案 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语句的结果。)