Thursday 15 September 2011

oop - fortran user defined type not found when type name overloaded as the constructor -



oop - fortran user defined type not found when type name overloaded as the constructor -

i wrote codes in file this

module modulebasicgeometry4 ... type tpoint ... end type tpoint interface tpoint module procedure :: tpointinit1,tpointinit2 end interface tpoint contains ... end module modulebasicgeometry4

in file, want utilize user-defined derived type tpoint. used utilize statement:

... utilize modulebasicgeomentry4 type(tpoint) :: ... ...

however, when compile these files ifort2013_sp1.3.174, told me tpoint not derived type name, , if deleted interface statement in first file, ok. seems interface statement masks type statement since have same name. more weirdly, aslo defined many other derived types , corresponding interfaces constructors in same first file, , work ok. leads odd problem?

p.s. think found causes don't know why. not true said other types work ok. in sec file, since need procedure pointers, wrote

... interface ... function ... utilize moudlebasicgeometry4 ... end function ... end interface ...

i found types used before interface statement work well. long types defined in first file used after interface statement, ifort compiler give error message: "this not derived type name." what's more , if delete utilize modulebasicgeometry4 statement in above interface statement, evetything ok. explain why , tell me how solve problem? many thanks.

from fortran 2003 con utilize (inside interfaces) import statement importing entities accessible outside interface, way can substitute use statement seems problematic in case

i tried reproduce code , next compiles correctly gfortran-4.8.

module:

module modulebasicgeomentry4 implicit none type tpoint integer :: integer :: b end type tpoint interface tpoint module procedure :: tpointinit1,tpointinit2 end interface tpoint contains function tpointinit1(a) result(point) integer, intent(in) :: type(tpoint) :: point point%a = point%b = end function function tpointinit2(a,b) result(point) integer, intent(in) :: a,b type(tpoint) :: point point%a = point%b = b end function end module modulebasicgeomentry4

main:

program main utilize modulebasicgeomentry4, : tpoint implicit none type(tpoint) :: point1 interface integer function foo(point) import tpoint type(tpoint) :: point end function end interface type(tpoint) :: point2 point1 = tpoint(1) point2 = tpoint(1,2) print*, foo(point1) print*, foo(point2) end programme main integer function foo(point) utilize modulebasicgeomentry4 , : tpoint type(tpoint) :: point foo = point%a + point%b end function

oop constructor fortran

No comments:

Post a Comment