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

时间:2017-11-30 06:44:47

标签: list fortran copy

现在假设我在模块中有一个类型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

1 个答案:

答案 0 :(得分: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类型定义赋值。

但请记住,所有这些都是复制价值。在你的第一个代码片段中,你有一个指针。使用指针,您经常执行指针赋值=>,这是另一回事。