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

问题描述 投票:0回答:1

假设我现在在模块中有一个类型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
list fortran copy
1个回答
0
投票

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

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

您只需使用默认分配即可

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类型定义赋值。


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

© www.soinside.com 2019 - 2024. All rights reserved.