2013-04-26 3 views
0

Я пытаюсь иметь такое же имя для двух подпрограмм, но я получаю сообщение об ошибке:Подпрограммы с таким же именем

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 

ответ

0

Я думаю, что вы можете поместите их в интерфейсный блок:

interface set_tpnt_ellipse 
    module procedure set_spnt_ellipse, set_cpnt_ellipse 
end interface 
+0

Я называю их другим именем, set_spnt_ellipse и t_tpnt_ellipse. Затем я использую procedure :: set_ellipse_corner => set_spnt_ellipse, set_tpnt_ellipse в определенном типе, который, похоже, не работает. Он всегда выбирает первую подпрограмму. – Pingu

+0

Этот тип в модуле – Pingu

+0

Извините. Неправильно. См. Мое редактирование. –

Смежные вопросы