是否有一种方法可以使用名称列表I/O特性读取具有可分配组件的派生类型?



是否有一种方法可以使用名称列表I/O特性来读取具有可分配组件的派生类型?

我唯一能找到的关于它的东西是https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/269585,它以一个相当没用的注释结尾。

编辑:

我有用户定义的派生类型,需要从输入文件中填充信息。所以我想找一个方便的方法。Namelist似乎是一个不错的路径,因为它非常简洁(基本上只有两行)。一个用于创建名称列表,然后读取名称列表。名称列表似乎也是一个不错的选择,因为在文本文件中,它迫使您非常清楚地显示每个值的位置,我发现这比编译器知道确切顺序的值列表更可取。如果我或其他任何人需要知道哪个值对应于哪个变量,那么就需要做更多的工作,并且当不可避免地需要一个新值时,需要做更多的工作来保持干净。

我想做一些基本的形式:

!where myType_T is a type that has at least one allocatable array in it
type(myType_T) :: thing 
namelist /nmlThing/ thing
open(1, file"input.txt")
read(1, nml=nmlThing)

我可能误解了用户定义的I/O过程,但它们似乎不是一个非常通用的解决方案。似乎我需要在任何时候做这个操作都需要写一个新的,而且它们似乎不支持

&nmlThing
  thing%name = "thing1"
  thing%siblings(1) = "thing2"
  thing%siblings(2) = "thing3"
  thing%siblings(3) = "thing4"
  !siblings is an allocatable array
/

语法。

我找到了一些解决这个问题的方法,但似乎没有一个非常简洁或优雅。目前,我有一个虚拟的用户定义类型,它的数组很大,而不是可分配的,然后我写了一个函数来将信息从虚拟的名称列表友好类型复制到包含类型的可分配字段。它工作得很好,但它很难看,我需要在代码中执行相同类型的操作,大约有4个地方。

如果您希望使用可分配组件,那么您需要为用户定义的派生类型输入/输出过程提供一个可访问的泛型接口(通常通过为此类过程具有泛型绑定的类型)。您可以链接到带有此类过程示例的线程。

一旦被调用,用户定义的派生类型输入/输出过程就负责读取和写入数据。这可以包括在派生类型的组件上调用名称列表输入/输出。

Fortran 2003还提供了带有长度参数的派生类型。这可以提供一种解决方案,而不需要用户定义的派生类型输入/输出过程。然而,与当前的编译器实现相比,使用带有长度参数的派生类型,结合使用名称列表,将使您坚定地处于"高度实验性"的类别中。

最新更新