现在假设我在模块中有一个类型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
答案 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类型定义赋值。
但请记住,所有这些都是复制价值。在你的第一个代码片段中,你有一个指针。使用指针,您经常执行指针赋值=>
,这是另一回事。