繁体   English   中英

有没有一种方法可以使用名称列表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/zh-cn/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种操作。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM