首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >条件fortran记录变量选择

条件fortran记录变量选择
EN

Stack Overflow用户
提问于 2017-06-08 02:52:27
回答 2查看 80关注 0票数 1

我定义了一个结构:

代码语言:javascript
运行
复制
STRUCTURE /IOA/
  INTEGER*2 ID
  .....
END STRUCTURE

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

代码语言:javascript
运行
复制
STRUCTURE /IOB/
  INTEGER*2 ID
  .....
END STRUCTURE

我的程序目前有:

代码语言:javascript
运行
复制
RECORD /IOA/ A
RECORD /IOB/ B

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

有没有办法在代码中有某种类型的条件,根据需要使用A或B?例如,是否可以创建占位符记录(变量?)"IO“,并根据输入定义它?:

代码语言:javascript
运行
复制
If user input = 1, IO = A
else IO = B
.....

IO.ID = 30

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-06-08 18:45:29

这就是现代Fortran (2003及更高版本)中多态性的用途。

代码语言:javascript
运行
复制
   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的一部分。

票数 3
EN

Stack Overflow用户

发布于 2017-06-08 04:40:37

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

代码语言:javascript
运行
复制
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的程序中,当然,您可以决定是否分配该指针:

代码语言:javascript
运行
复制
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语句的结果。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44420663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档