Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 元素数组中的多态性_Arrays_Fortran_Function Pointers - Fatal编程技术网

Arrays 元素数组中的多态性

Arrays 元素数组中的多态性,arrays,fortran,function-pointers,Arrays,Fortran,Function Pointers,假设我定义了一个名为geometry的派生类型(在Fortran 2003中),并将其扩展为两个新的派生类型:circle和triangle。每个扩展类型都有自己的构造函数,NewCircle和NewTriangle,分别返回一个circle对象和一个triangle对象 那么我想这样做: use appropriate_module class(geometry), allocatable :: Geo(:) allocate(Geo(2)) Geo(1) = NewCircle Geo(2)

假设我定义了一个名为
geometry
的派生类型(在Fortran 2003中),并将其扩展为两个新的派生类型:
circle
triangle
。每个扩展类型都有自己的构造函数,
NewCircle
NewTriangle
,分别返回一个
circle
对象和一个
triangle
对象

那么我想这样做:

use appropriate_module
class(geometry), allocatable :: Geo(:)
allocate(Geo(2))
Geo(1) = NewCircle
Geo(2) = NewTriangle
当然,最后两行在Fortran 2003标准中是无效的。 我不想创建一个封装在派生类型中的指针数组来链接不同类型的对象,因为在数组中链接对象之前需要先创建对象。在上述(假设的)情况下,将立即创建对象并将其存储在数组中


有没有这样做的建议,或者这是语言的一个限制?

如果需要值语义,请使用多态可分配组件创建一个派生类型数组

use appropriate_module
type geometry_element
  class(geometry), allocatable :: item
end type geometry_element

type(geometry_element), allocatable :: geo(:)
geo = [ geometry_element(NewCircle()),  &
        geometry_element(NewTriangle()) ]

如果使用可分配参数(而不是通过函数结果)将新的
geometry
对象传递回调用范围,则
MOVE\u ALLOC
内在函数提供了一种有效的方法,可以将构造的值移动到数组的元素中。

您知道该方法不起作用,并且该方法确实起作用,所以我恐怕不明白你的问题。你想要实现什么?也就是说,关于“创建”的讨论还不清楚。在派生类型中创建一个指针数组,并将每个指针指向(或“链接”)一个由返回指向新对象的指针的“新”例程(类似于C++中的例程)生成的指针,这是不可接受的吗?然后,在形式上没有预先生成对象。这就是语言的工作方式。数组中的每个元素必须具有相同的类型。这是最基本的,尤其是它们必须具有相同的存储大小,但这不是唯一的原因。通过创建指针数组,您知道解决方案,因此我不知道您不想听到更多的内容。我现在以各种方式尝试上面的代码,但遇到错误“无法将类型(NewCircle)转换为类(geometry)”(使用gfortran4.8)。ifort14.0还返回类似的错误(即使使用-ASSUE realloc_lhs)。要使其工作,是否需要使用一些自定义函数重载geometry_element(),该函数使用“source=”关键字进行分配?(如果是,代码为我运行。)@roygvib你能用ifort 15试试吗?我似乎还记得,我在使用默认构造函数和可分配组件的旧iFort中遇到过问题。@francescalus-Hmm。。我手头没有ifort15,所以无法尝试。。。如果可能的话,我会安装它。通过结构构造函数定义多态可分配组件需要Fortran 2008编译器(行为是根据对多态可分配变量的赋值定义的)。ifort还不是这样的编译器。对于较旧的Fortran标准,您可以使用
ALLOCATE(geo(nn)%item,SOURCE=NewXxxx())
或为
geometry\u元素
类型提供定义的赋值,该类型将
CLASS(geometry)
作为与
geo(nn)=NewXxxx()右侧相对应的参数的变通方法。