Types 同名子例程
我试图为两个子例程使用相同的名称,但得到错误:Types 同名子例程,types,fortran,Types,Fortran,我试图为两个子例程使用相同的名称,但得到错误: gfortran gshapes.f08 gshapes_utest.f08 -o gshapes_utest.x gshapes_utest.f08:53.41: call ellips%set_ellipse_corner (crnr1, crnr2) 1 Error: Type mismatch in argument 'xlen' at (1); passed TY
gfortran gshapes.f08 gshapes_utest.f08 -o gshapes_utest.x
gshapes_utest.f08:53.41:
call ellips%set_ellipse_corner (crnr1, crnr2)
1
Error: Type mismatch in argument 'xlen' at (1); passed TYPE(gcorner) to REAL(4)
这是类型定义和相关子例程:
type, public :: Ellipse
type(GCenter) :: centr ! Center coordinate of ellipse
type(GCorner) :: crnr1 ! Upper left corner
type(GCorner) :: crnr2 ! Botton right corner
real :: xlen
real :: ylen ! Size of ellipse in x- and y-directions
character (len=12) :: parm ! Parameterisation of ellipse
contains
procedure :: set_cpnt_ellipse
procedure :: set_ellipse_corner => set_spnt_ellipse, set_tpnt_ellipse
procedure :: print => print_ellipse
end type Ellipse
contains
! \brief Initialize geographical coordinate system grid object
subroutine set_cpnt_ellipse (ellips, gcentr, xlen, ylen)
class(Ellipse) :: ellips
type(GCenter) :: gcentr
real :: xlen, ylen
ellips%centr = gcentr
ellips%xlen = xlen
ellips%ylen = ylen
ellips%parm = 'center'
end subroutine set_cpnt_ellipse
subroutine set_spnt_ellipse (ellips, gcrnr, xlen, ylen)
class(Ellipse) :: ellips
type(GCorner) :: gcrnr
real :: xlen
real :: ylen
ellips%crnr1 = gcrnr
ellips%xlen = xlen
ellips%ylen = ylen
ellips%parm = 'corner'
end subroutine set_spnt_ellipse
subroutine set_tpnt_ellipse (ellips, gcrnr1, gcrnr2)
class(Ellipse) :: ellips
type(GCorner) :: gcrnr1
type(GCorner) :: gcrnr2
ellips%crnr1 = gcrnr1
ellips%crnr2 = gcrnr2
ellips%parm = 'corners'
end subroutine set_tpnt_ellipse
我认为可以将它们放在接口块中:
interface set_tpnt_ellipse
module procedure set_spnt_ellipse, set_cpnt_ellipse
end interface
我给它们取了一个不同的名字,set_spnt_椭圆和t_tpnt_椭圆。然后我在定义的类型中使用procedure::set_eliple\u corner=>set_spnt\u eliple,set_tpnt\u eliple,这似乎不起作用。它总是选择声明的第一个子例程。问题是子例程包含在类型声明中。Fortran抱怨有错误:(1)处的“set_ellipse”不是“ellipse”结构的成员我已将其添加到类型声明中,Fortran给出错误:模块过程(1)必须在泛型模块接口中在派生类型定义中,我指定了一个类型绑定过程部分,它由一个CONTAINS语句组成,后跟一些过程。