这不是一个简单的问题您可以使用select type
,但是 Fortran 没有类似的东西type is(type_of(x))
。另一方面,还有SAME_TYPE_AS()
and EXTENDS
TYPE_OF()
内在函数,但不能将它们用作类型保护。
有必要确保两者的动态类型array
and element
是相同的。
我认为这是标准的缺陷。
但是,您的方法仍然存在错误。您应该使函数结果可分配,以便能够将其分配给正确的动态类型:
class(*), allocatable ::add_element(:)
您可能会想到以下内容:(未经测试!使用 gfortran-4.9 ifort14 进行编译)
allocate(add_element(size(array)+1), mold=array)
但如何实际转移这些值我不知道,我担心如果不诉诸一些肮脏的伎俩,这可能是不可能的。
你甚至不能使用transfer
这就是我看到的真正的缺陷。即使你可以用多态模具调用转移
transfer(element, add_element(1))
你无法将它分配给数组元素
add_element(1) = transfer(element, add_element(1))
我的观点是 Fortran 缺乏类型保护选项,只能确保两个变量具有相同的动态类型。
您可能会想到以下内容:(未经测试!使用 gfortran-4.9 ifort14 进行编译)
function add_element(array,element)
use iso_c_binding
implicit none
class(*),intent(in)::array(:)
class(*),intent(in)::element
class(*), allocatable ::add_element(:)
type(c_ptr) :: tmp
interface
function memcpy(dest, src, n) bind(c)
use iso_c_binding
integer(c_intptr_t),value :: dest, src
integer(c_size_t) :: n
type(c_ptr) :: memcpy
end function
end interface
allocate(add_element(size(array)+1), mold=array)
tmp = memcpy(loc(add_element(size(array)+1)), &
loc(array), &
size(array, kind=c_size_t) * storage_size(array, c_size_t)/8_c_size_t )
tmp = memcpy(loc(add_element(size(array)+1)), &
loc(array(1)), &
storage_size(element, c_size_t)/8_c_size_t )
end function