具有可选组件的Fortran派生类型
在派生类型中使用可选组件是否正确。例如,下面代码段中的变量“fname_new”。如果没有,怎么办?我想根据源的类型是1还是2,选择性地包括“fname_new”具有可选组件的Fortran派生类型,fortran,fortran90,derived-types,Fortran,Fortran90,Derived Types,在派生类型中使用可选组件是否正确。例如,下面代码段中的变量“fname_new”。如果没有,怎么办?我想根据源的类型是1还是2,选择性地包括“fname_new” TYPE, PUBLIC :: species CHARACTER(LEN=12) :: spname CHARACTER(LEN=12) :: source CHARACTER(LEN=20) :: fname CHARACTER(LEN=12) :: field CHARACTER(LEN=20),OPTION
TYPE, PUBLIC :: species
CHARACTER(LEN=12) :: spname
CHARACTER(LEN=12) :: source
CHARACTER(LEN=20) :: fname
CHARACTER(LEN=12) :: field
CHARACTER(LEN=20),OPTIONAL :: fname_new
END TYPE species
编译时必须知道组件的数量,因此不能有可选组件。但是,您可以有一个可分配组件。就你而言:
type :: species
...
character(len=:), allocatable :: fname_new
end type
另一种方法是构造某种类层次结构。这样做的好处是将信息编码为类型而不是字符串
编辑:@VladimirF指出,这种方法需要fortran-2003
实际上,如果
fname\u new
组件实际上只有20个字符长,那么将其设置为可分配组件不会节省大量空间。在x86/64位体系结构上,可分配的将是一个8字节的指针,并将强制对您的类型进行某种类型的对齐,这将占用更多的字节。我可以把它作为一个字符(len=20)
一个注释是为了说明它不是Fortran 90而是2003。很可能声明一个类型,它的布局在编译时是未知的。@IanH你有一个例子吗?我不知道这是否是IanH的意思,但取决于你如何定义“布局”,参数化类型可能属于这种类型。@francescalus我在考虑“布局”的大小和对齐方式。你确定需要旧的和现在过时的Fortran 90吗?是的,只有Fortran 90!