【发布时间】:2015-10-02 22:55:02
【问题描述】:
有没有办法使用 namelist I/O 功能来读取具有可分配组件的派生类型?
我唯一能找到的就是https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/269585,它以一个相当无用的说明结束。
编辑:
我有用户定义的派生类型,需要从输入文件中填充信息。所以,我试图找到一种方便的方法来做到这一点。 Namelist 似乎是一条不错的路线,因为它非常简洁(基本上是两行)。一个创建名单,然后读取一个名单。 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 个地方。
因此试图找到一个好的解决方案。
【问题讨论】:
-
刚刚收到“可分配或指针派生类型字段需要用户定义的 I/O 过程”的错误。我会用更多细节更新答案。
-
您是尝试在读取时分配,还是在读取之前分配组件?
-
阅读中。我不介意两次调用 read 但是输入文件给出了大小。
标签: io fortran intel-fortran