Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有可选组件的Fortran派生类型_Fortran_Fortran90_Derived Types - Fatal编程技术网

具有可选组件的Fortran派生类型

具有可选组件的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

在派生类型中使用可选组件是否正确。例如,下面代码段中的变量“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\u new
组件实际上只有20个字符长,那么将其设置为可分配组件不会节省大量空间。在x86/64位体系结构上,可分配的将是一个8字节的指针,并将强制对您的类型进行某种类型的对齐,这将占用更多的字节。我可以把它作为一个
字符(len=20)

一个注释是为了说明它不是Fortran 90而是2003。很可能声明一个类型,它的布局在编译时是未知的。@IanH你有一个例子吗?我不知道这是否是IanH的意思,但取决于你如何定义“布局”,参数化类型可能属于这种类型。@francescalus我在考虑“布局”的大小和对齐方式。你确定需要旧的和现在过时的Fortran 90吗?是的,只有Fortran 90!