有没有办法使用名单列表I / O功能来读取具有可分配组件的派生类型?

时间:2015-10-02 22:55:03

标签: io fortran intel-fortran

有没有办法使用名单列表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个位置。

因此试图找到一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

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

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

Fortran 2003还提供了带有长度参数的派生类型。这些可以提供解决方案而无需用户定义的派生类型输入/输出过程。但是,使用带有长度参数的派生类型,结合名称列表,将使您牢牢地处于与当前编译器实现相关的“高度实验性”类别。