【发布时间】:2019-06-13 04:10:57
【问题描述】:
我有三个函数用于同一件事,但用于不同的虚拟参数类型:flip、flipLogical 和 flipInt。他们的代码实际上是完全相同的!还有另一个函数叫做flip3D,它只用于真正的虚拟参数,它从内部调用翻转。这就是现在一切正常的方式:
function flip(data)
real, dimension(:,:), intent(in) :: data
real, dimension(:,:), allocatable :: flip
integer :: m, n, i
m = size(data,1)
n = size(data,2)
allocate(flip(m,n))
do i=1,m
flip(m-i+1,:) = data(i,:)
end do
end function flip
function flipLogical(data)
logical, dimension(:,:), intent(in) :: data
logical, dimension(:,:), allocatable :: flipLogical
integer :: m, n, i
m = size(data,1)
n = size(data,2)
allocate(flipLogical(m,n))
do i=1,m
flipLogical(m-i+1,:) = data(i,:)
end do
end function flipLogical
function flipInt(data)
integer, dimension(:,:), intent(in) :: data
integer, dimension(:,:), allocatable :: flipInt
integer :: m, n, i
m = size(data,1)
n = size(data,2)
allocate(flipInt(m,n))
do i=1,m
flipInt(m-i+1,:) = data(i,:)
end do
end function flipInt
function flip3D(data)
real, dimension(:,:,:), intent(in) :: data
real, dimension(:,:,:), allocatable :: flip3D
integer :: m, n, o, j
m = size(data, 1)
n = size(data, 2)
o = size(data, 3)
allocate(flip3D(n, m, o))
do j = 1, o
flip3D(:,:,j) = flip(data(:,:,j))
end do
end function flip3D
虽然这工作得很好,但它非常丑陋。我想要一个多态函数翻转,它只适用于任何类型,我可以从 Flip3D 调用它,提供一个实变量作为虚拟参数。我正在尝试这样的事情:
function flip(data)
class(*), dimension(:,:), intent(in) :: data
class(*), dimension(:,:), allocatable :: flip
integer :: m, n, i
m = size(data,1)
n = size(data,2)
allocate(flip(m,n), mold=data)
do i=1,m
flip(m-i+1,:) = data(i,:)
end do
end function flip
但后来我收到错误
script.f90:698:7:
flip(m-i+1,:) = data(i,:) 1 Error: Nonallocatable variable must not be polymorphic in intrinsic assignment at (1) - check that there is a matching specific subroutine for '=' operatorscript.f90:714:23:
flip3D(:,:,j) = flip(data(:,:,j)) 1 Error: Can't convert CLASS(*) to REAL(4) at (1)
【问题讨论】:
-
一个子程序会更容易。
-
@VladimirF 更容易实现多态性?您能详细说明答案吗?我愿意改变。
标签: fortran polymorphism gfortran