【问题标题】:How to copy an unknown type of data in Fortran?如何在 Fortran 中复制未知类型的数据?
【发布时间】: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=BA=&gt;B 有什么问题?
  • 也许他得到了一个错误,即 gfortran 中不允许(即实现)多态赋值。但这个问题应该更清楚。 @hengyueli 请告诉我们你需要复制的代码。
  • 在这里我刚刚发布了一个问题,我想知道是否可能。我还没有代码。如果我按照@francescalus 的建议做,A = B。因为 A 是指针,这是什么意思?如果我使用 A=>B,B 将被指向但不会被复制。
  • 正如弗拉基米尔 F 的评论所建议的,我想知道您为什么对 A=B 有问题。使用A 可分配这样的多态赋值是可能的编译器支持。我不清楚您是否有 Fortran 问题或设计问题。

标签: list fortran copy


【解决方案1】:

使用非多态变量确实没有问题,至少对于您显示的程序。

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

你可以只使用默认分配

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 定义分配。


但请记住,所有这些都是复制价值。在您的第一个代码 sn-p 中,您有一个指针。使用指针时,您通常会进行指针分配 =&gt;,这是另一回事。

【讨论】:

  • 它看起来仍然与我想要的不同。正如你所展示的,所有的分配都在 type(newdata) 可以“看到”的地方。我想在moduleA外部调用子程序CopyBtoA,但在moduleA中定义CopyBtoA。我最初的要求是建立一个列表结构。它包含一些操作。但确切的定义将是外部的扩展类型。因此,我期望在 CopyBtoA 的定义中包含类(数据),而不是类型(数据)。
  • 顺便说一句,我使用指针的原因是我想保存所有新数据。我只能想出这个办法。我通过指针创建类型(newdata)的所有数据,然后我可以将这些指针传递给moduleA。
  • 我的 cmets 中的一个语法错误:saw -> seen。请不要与它混淆。
  • 是你用type(newdata)写了示例代码!如果你想要不同的用法,你必须向我们展示你想写的代码,我看不懂你的想法。我展示的代码DOES 适用于多态,这意味着它DOES 适用于class(data)。去尝试一下。这一切都在答案中。我再说一遍,阅读答案,是class(data),不是type(newdata)
  • 如果你想做一个列表结构,给我们看真实示例代码,而不是你的program main,那是没用的。阅读meta.stackexchange.com/questions/66377/what-is-the-xy-problem将A复制到B没有问题,答案全在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多