在派生类型中包含可选组件是否正确。例如,下面代码片段中的变量“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),OPTIONAL :: fname_new
END TYPE species
最佳答案
组件的数量必须在编译时已知,因此不能有可选组件。但是,您可以拥有可分配的组件。对于您的情况:
type :: species
...
character(len=:), allocatable :: fname_new
end type
另一种方法是构建某种类层次结构。这样做的好处是用类型而不是字符串来编码信息。
编辑:正如 @VladimirF 指出的,这种方法需要 fortran-2003。
实际上,如果 fname_new
组件实际上只有 20 个字符长,那么您不会通过将其设为可分配来节省大量空间。在 x86/64 位架构上,可分配的将是一个 8 字节指针,并将强制对您的类型进行某种对齐,从而消耗更多字节。我可能会将其保留为字符(len=20)
。
关于具有可选组件的 Fortran 派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032527/