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

标签 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),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/

相关文章:

variables - 在 Fortran 中命名派生类型的良好实践

fortran - 提前 ='no' 在 Fortran 中意味着什么?

fortran - OpenMP 工作精度

Fortran 90 - 将值从主子例程传输到函数和其他子例程

Fortran : Initialize all variables to a specific default value

fortran - 定义派生数据类型数组的默认值

haskell - 派生类型及其依赖项

bash - Fortran 的麻烦。我怎样才能制作一个更高效、更简单的界面。也许使用 Bash 脚本或 VBA?

floating-point - Fortran/gfortran 中的高精度幂运算

types - 使用 gfortran 强制显式变量声明