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

标签 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 似乎是一条不错的路线,因为它非常简洁(基本上是两行)。一个是创建名单,然后是一个名单读取。 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 个地方。

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

最佳答案

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

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

Fortran 2003 还提供带有长度参数的派生类型。这些可以提供不需要用户定义的派生类型输入/输出过程的解决方案。但是,使用带有长度参数的派生类型,结合名称列表,将使您在当前编译器实现方面稳居“高度实验性”类别。

关于io - 有没有办法使用名单 I/O 功能来读取具有可分配组件的派生类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32916997/

相关文章:

fortran - 模块过程的名称与包含的作用域单元中的名称冲突

Java 没有正确写入文件

java - 在Java中查找特定文件夹

fortran - 如何在 Fortran 中处理大整数?

c - Fortran 和 C 混合编程(共享内存)

arrays - Fortran 数组中的变量被删除?

java - 将用户输入文本复制到输出文本文件(java)

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

c - 正确地将多维 C 数组传递给 fortran,以便 size 函数(在 fortran 中)在每个维度中获得正确的大小?

fortran - 不同Fortran预处理器的相对包含路径