如何在Fortran中复制未知类型的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Fortran中复制未知类型的数据?相关的知识,希望对你有一定的参考价值。

假设我现在在模块中有一个类型data(称为模块A)

type::data
endtype

该定义留空。将来我会将它扩展到任何类型,即时:

type,extends(data)::newdata
   ...(something general data )
endtype

现在我想要的是在模块A中定义一个过程来复制newdata类型。可能吗?如下:

subroutine copyBtoA(A,B)
 class(data),pinter::A
 class(data)::B
 A <- B
endsubroutine

即使我们不知道newdata的类型是什么,这里A是一个指针,我想我们可以根据B以某种方式分配它?


更清楚的是,我想要做的是定义一个列表结构。由于它是一种结构,因此尚未定义类型data(在模块A中)。但是我想定义一个复制数据类型的函数。关键是我想要复制尚未定义的数据。逻辑上看起来有点奇怪。

当调用子程序copyBtoA时,输入A和B实际上是newdata类型。而在模块A中还没有分配。如果在定义中我使用Allocate(A),我认为它是data类型。那么A=B是不可能的。如果我使用select type,那么我还不知道类型。

!---------------------------example code---------------

module moduleA
   type::data
   endtype
 contains
   subroutine copyBtoA(A,B)
     type(data),allocatable::A
     type(data)::B
     !-------------------
     A = B
   endsubroutine
endmodule

module moduleB
  use moduleA
  type,extends(data)::newdata
     real::something
  endtype
endmodule

program main
use moduleB
!
type(newdata),allocatable::data2
type(newdata)::data1
data1%something = 1.
! call copyBtoA(data2,data1)
endprogram
答案

对于非多态变量,确实没有问题,至少对于你展示的程序。

也许你的代码毕竟没有真正显示出真正的用途?你首先谈到了一些列表结构,最后你只展示了一些简单的程序......

您只需使用默认分配即可

type(newdata),allocatable::data2
type(newdata)::data1
data1%something = 1.

data2 = data1

在Fortran 2008中,即使使用多态,你也可以做到这一点,这意味着你不能直接看到type(newdata)

class(data),allocatable::data1,data2
class(data)::data1
allocate(newdata::data1)

data2 = data1

足够。

在gfortran,这还不支持。你必须做

class(data),allocatable::data1,data2
class(data)::data1
allocate(newdata::data1)

allocate(data2, source = data1)

总是有可能通过用户定义的子程序覆盖赋值,但这里并不是必需的。您可能还必须为newdata类型定义赋值。


但请记住,所有这些都是复制价值。在你的第一个代码片段中,你有一个指针。使用指针,你经常做指针赋值=>,这是其他的东西。

以上是关于如何在Fortran中复制未知类型的数据?的主要内容,如果未能解决你的问题,请参考以下文章

GDB 可以用于在 Fortran 90 中打印派生类型的可分配数组的值吗? [复制]

从 Fortran 中的 HDF 文件中读取长度未知的数组

无法在Fortran中读取未知长度字符串的实数

Parceable 错误:在偏移量 1112 处解组未知类型代码 7274595

如何在 Fortran 90 中跳过带有“#”符号的行? [复制]

用逗号分割长度未知但子字符串格式已知的 Fortran 字符串?