2013-05-01 2 views
-1

Я пишу код в Fortran с производными типами и сталкиваясь с проблемой, но все еще не могу понять, что происходит не так ........................... .................................................. .................................................. .................................................. .................................................. .................................................. .............Ошибки Fortran при использовании производных типов

make -f vbld.mk 
gfortran -c gshapes.f08 
gshapes.f08:100.31: 

     generic, public :: get => get_ellipse,  & 
           1 
Error: Undefined specific binding 'get_ellipse_minmax' as target of GENERIC 'get' at (1) 
gshapes.f08:136.31: 

     generic, public :: get => get_cylinder,  & 
           1 
Error: Undefined specific binding 'get_cylinder_minmax' as target of GENERIC 'get' at (1) 
gshapes.f08:139.15: 

     procedure :: print => print_cylinder 
       1 
Error: Dummy argument 'cyld' of 'print' at (1) should be named 'elips' as to match the  
corresponding argument of the overridden procedure 
gshapes.f08:135.15: 

     procedure :: set => set_cylinder 
       1 
Error: Dummy argument 'cyld' of 'set' at (1) should be named 'elips' as to match the 
corresponding argument of the overridden procedure 
gshapes.f08:74.31: 

     generic, public :: get => get_rectangle,  & 
           1 
Error: Undefined specific binding 'get_rectangle_minmax' as target of GENERIC 'get' at (1) 
gshapes.f08:118.31: 

     generic, public :: get => get_prism,  & 
           1 

Error: Undefined specific binding 'get_prism_minmax' as target of GENERIC 'get' at (1) 
gshapes.f08:121.15: 

     procedure :: print => print_prism 
       1 
Error: Dummy argument 'prsm' of 'print' at (1) should be named 'rect' as to match the 
corresponding argument of the overridden procedure 
gshapes.f08:117.15: 

     procedure :: set => set_prism 
       1 
Error: Dummy argument 'prsm' of 'set' at (1) should be named 'rect' as to match the 
corresponding argument of the overridden procedure 
make: *** [gshapes.mod] Error 1 
+0

Показать код. Ошибки указывают на то, что у вас есть имена процедур в связанных с вашим типом обобщенных операторах, а не в конкретных именах привязок; и некоторые аргументы, характерные несоответствия в определенных переопределениях привязки. – IanH

ответ

0
module shape 
implicit none 

type, public :: GCoord 
    real :: x 
    real :: y 
    real :: z 
end type GCoord 

type, extends (GCoord) :: GCentr 
end type GCentr 

type, extends (GCoord) :: GCornr 
end type GCornr 

type, public :: Rectangle 
    type(GCentr) :: cn 
    type(GCoord) :: pa 
    real :: b 
    type(GCornr) :: p1, p2, p3, p4 
    contains 
    generic, public :: get => getu, getm 
end type Rectangle 

contains 

subroutine getu (rect, val) 
    class(Rectangle), intent(in) :: rect 
    integer, intent(in) :: val 
    write (*,*) 'GETU' 
end subroutine getu 

subroutine getm (rect, val) 
    class(Rectangle), intent(in) :: rect 
    complex, intent(in) :: val 
    write (*,*) 'GETM' 
end subroutine getm 

end module shape 
+0

я сделал в приведенном выше пример, и ошибка, я получаю rectangle.f08: 52,31: общего, общественный :: прибудет => Гет, getm Ошибки: Не определен специфическое связывание «getm» в качестве цели Generic «получить» в (1) – Pingu

+0

Измените свой вопрос и введите код примера. – IanH

2

родового связывания выдвигает специфические привязок, которые могут быть приняты во внимание при родовое связывание Ссылки на сайты в коде. Эти специфические привязки затем ссылаются на конкретные процедуры (и эти конкретные процедуры могут быть переопределены - они могут быть разными конкретными процедурами в расширениях).

Ваши общие переплеты ссылки имен процедур, а не специфические связывающие имена. Правильный подход:

TYPE parent 
CONTAINS 
    PROCEDURE :: SpecificBindingA => ProcedureA 
    PROCEDURE :: SpecificBindingB => ProcedureB 
    GENERIC :: GenericBinding => SpecificBindingA, SpecificBindingB 
END TYPE parent 

В коде, если есть объект объявлен TYPE(parent) :: obj, то ссылка на obj%GenericBinding либо разрешения на obj%SpecificBindingA или obj%SpecificBindingB в зависимости от типа фактических аргументов в качестве ссылки. Затем динамический тип obj определит фактическую процедуру, которая вызывается для конкретной конкретной привязки.

Процедуры ProcedureA и ProcedureB должны будут иметь свой первый фиктивный аргумент, объявленный соответствующим, чтобы он мог быть переданным объектом (он должен быть объявлен CLASS(parent), иметь то же имя аргумента и т. Д.). Любые переопределения в расширениях родителя должны соответствующим образом изменять тип переданного аргумента и соответствовать характеристикам любых других фиктивных аргументов (включая имя фиктивного аргумента).

В качестве альтернативы, может быть, вы просто хотите получить общее название для конкретных процедур. Вы делаете это, используя блок интерфейса.

INTERFACE GenericName 
    MODULE PROCEDURE ProcedureA 
    MODULE PROCEDURE ProcedureB 
END INTERFACE GenericName 

В этом случае ссылка GenericName(...) будет разрешен к ProcedureA или ProcedureB в зависимости от аргументов в ссылке. В этом случае динамический поиск конкретной процедуры на динамическом типе объекта отсутствует.