在派生类型中包含可选组件是否正确。例如,下面的代码段中的变量“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
答案 0 :(得分:2)
必须在编译时知道组件的数量,因此您不能拥有可选组件。但是,您可以拥有可分配的组件。在你的情况下:
type :: species
...
character(len=:), allocatable :: fname_new
end type
另一种方法是构造某种类层次结构。这将有利于在类型而不是字符串中编码信息。
编辑:正如@VladimirF所指出的,这种方法需要fortran-2003。
实际上,如果fname_new
组件实际上只有20个字符长,那么你就不会通过使它成为可分配来节省大量空间。在x86 / 64位体系结构上,allocatable将是一个8字节的指针,并将强制在您的类型上进行某种对齐,这会占用更多的字节。我可以将其留作character(len=20)
。