有没有办法使用 namelist I/O 功能来读取具有可分配组件的派生类型?
Is there a way to use the namelist I/O feature to read in a derived type with allocatable components?
有没有办法使用名单 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
/
我觉得合适的语法。
我找到了一些解决此问题的方法,但 none 似乎非常简洁或优雅。目前,我有一个虚拟的用户定义类型,它的数组很大而不是可分配的,然后我编写了一个函数来将信息从虚拟名单友好类型复制到包含类型的可分配字段。它工作得很好,但它很丑,我最多有 4 个地方需要在代码中执行相同类型的操作。
因此试图找到一个好的解决方案。
如果您想使用可分配的组件,那么您需要为用户定义的派生类型 input/output 过程提供一个可访问的通用接口(通常通过具有此类过程的通用绑定的类型)。你link给个跟帖用这样一个程序的例子。
一旦调用,该用户定义的派生类型 input/output 过程便负责读取和写入数据。这可以包括在派生类型的组件上调用名称列表 input/output。
Fortran 2003 还提供带有长度参数的派生类型。这些可能会提供一种解决方案,而无需用户定义的派生类型 input/output 过程。但是,使用带有长度参数的派生类型,结合名称列表,将使您在当前编译器实现方面稳居 "highly experimental" 类别。
有没有办法使用名单 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
/
我觉得合适的语法。
我找到了一些解决此问题的方法,但 none 似乎非常简洁或优雅。目前,我有一个虚拟的用户定义类型,它的数组很大而不是可分配的,然后我编写了一个函数来将信息从虚拟名单友好类型复制到包含类型的可分配字段。它工作得很好,但它很丑,我最多有 4 个地方需要在代码中执行相同类型的操作。
因此试图找到一个好的解决方案。
如果您想使用可分配的组件,那么您需要为用户定义的派生类型 input/output 过程提供一个可访问的通用接口(通常通过具有此类过程的通用绑定的类型)。你link给个跟帖用这样一个程序的例子。
一旦调用,该用户定义的派生类型 input/output 过程便负责读取和写入数据。这可以包括在派生类型的组件上调用名称列表 input/output。
Fortran 2003 还提供带有长度参数的派生类型。这些可能会提供一种解决方案,而无需用户定义的派生类型 input/output 过程。但是,使用带有长度参数的派生类型,结合名称列表,将使您在当前编译器实现方面稳居 "highly experimental" 类别。