【发布时间】:2017-11-30 06:44:47
【问题描述】:
现在假设我在一个模块(称为模块 A)中有一个类型 data
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 类型。在 moduleA 中,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
【问题讨论】:
-
你的 Fortran 语法不正确。
-
A=B或A=>B有什么问题? -
也许他得到了一个错误,即 gfortran 中不允许(即实现)多态赋值。但这个问题应该更清楚。 @hengyueli 请告诉我们你需要复制的代码。
-
在这里我刚刚发布了一个问题,我想知道是否可能。我还没有代码。如果我按照@francescalus 的建议做,A = B。因为 A 是指针,这是什么意思?如果我使用 A=>B,B 将被指向但不会被复制。
-
正如弗拉基米尔 F 的评论所建议的,我想知道您为什么对
A=B有问题。使用A可分配这样的多态赋值是可能的编译器支持。我不清楚您是否有 Fortran 问题或设计问题。