如何在Fortran中复制未知类型的数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Fortran中复制未知类型的数据?相关的知识,希望对你有一定的参考价值。
假设我现在在模块中有一个类型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
对于非多态变量,确实没有问题,至少对于你展示的程序。
也许你的代码毕竟没有真正显示出真正的用途?你首先谈到了一些列表结构,最后你只展示了一些简单的程序......
您只需使用默认分配即可
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类型定义赋值。
但请记住,所有这些都是复制价值。在你的第一个代码片段中,你有一个指针。使用指针,你经常做指针赋值=>
,这是其他的东西。
以上是关于如何在Fortran中复制未知类型的数据?的主要内容,如果未能解决你的问题,请参考以下文章
GDB 可以用于在 Fortran 90 中打印派生类型的可分配数组的值吗? [复制]
Parceable 错误:在偏移量 1112 处解组未知类型代码 7274595