【问题标题】:Is there a way to use the namelist I/O feature to read in a derived type with allocatable components?有没有办法使用 namelist I/O 功能来读取具有可分配组件的派生类型?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多