首页 文章

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

提问于
浏览
1

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

我唯一能找到的就是https://software.intel.com/en-us/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个位置 .

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

1 回答

  • 1

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

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

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

相关问题