我定义了一个结构:
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
谢谢。
发布于 2017-06-08 18:45:29
这就是现代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扩展结构和记录执行此操作。建议不要使用这些扩展。它们不是标准Fortran的一部分。
发布于 2017-06-08 04:40:37
我的建议是在模块中创建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语句的结果。)
https://stackoverflow.com/questions/44420663
复制相似问题