2014-10-27 91 views
-2

找不到Fortran用户定义类型我写了一些代码在一个文件中像这样当类型名重载作为构造

module ModuleBasicGeometry4 
    ... 
    type TPoint 
     ... 
    end type TPoint 

    interface TPoint 
     module procedure :: TPointInit1,TPointInit2 
    end interface TPoint 

    contains 
     ... 
end module ModuleBasicGeometry4 

在另一个文件中,我想用我的用户自定义的派生类型TPoint。我只是用使用声明:

... 
use ModuleBasicGeomentry4 
type(TPoint) :: ... 
... 

然而,当我编译ifort2013_sp1.3.174这些文件,它告诉我,TPoint不是派生类型名称,如果我在第一个文件删除的接口声明,一切都很好。由于它们具有相同的名称,因此界面语句似乎会掩盖类型语句。更奇怪的是,我还在同一个第一个文件中定义了许多其他派生类型和相应的接口作为其构造函数,并且它们都工作正常。那么是什么导致了这个奇怪的问题?

P.S. 我想我找到了一些原因,但我不知道为什么。我说其他类型的工作是不正确的。在第二个文件,因为我需要一些过程指针,我写了这样的事情

... 
interface 
    ... function ... 
     use MoudleBasicGeometry4 
     ... 
    end function ... 
end interface 
... 

我发现,只有那些该接口声明之前使用的类型工作。只要第一个文件中定义的类型在该接口语句之后使用,ifort编译器就会给出错误消息:“这不是派生类型名称”。更重要的是,如果我在上面的接口语句中删除了使用ModuleBasicGeometry4语句,那么evetything也是可以的。有人可以解释为什么,并告诉我如何解决这个问题?非常感谢。

回答

0

从2003年的Fortran您骗子利用(内部接口)的IMPORT声明导入是接口外部访问的实体,这种方式可以替代USE声明,这似乎是有问题的,这种情况下

我试着重现你的代码,下面的代码用gfortran-4.8正确编译。

模块:

module ModuleBasicGeomentry4 
    implicit none 
    type TPoint 
    integer :: a 
    integer :: b 
    end type TPoint 

    interface TPoint 
    module procedure :: TPointInit1,TPointInit2 
    end interface TPoint 

    contains 
    function TPointInit1(a) result(point) 
     integer, intent(in) :: a 
     type(TPoint)   :: point 
     point%a = a 
     point%b = a 
    end function 
     function TPointInit2(a,b) result(point) 
     integer, intent(in) :: a,b 
     type(TPoint)   :: point 
     point%a = a 
     point%b = b 
    end function 
end module ModuleBasicGeomentry4 

MAIN:

PROGRAM main 
    use ModuleBasicGeomentry4, only : 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 PROGRAM main 

integer function foo(point) 
    use ModuleBasicGeomentry4 , only : Tpoint 
    type(Tpoint)  :: point 
    foo = point%a + point%b 
end function 
+0

我想你的建议和它在你的情况与ifort工作。不幸的是,这并不适用于我的情况。不同的是,我的第二个文件也是模糊的。当我用导入语句替换有问题的use语句以使用第一个文件中定义的派生类型时,导入语句本身似乎不会导致任何错误,但是当我使用导入类型声明变量时,编译器会告诉“此派生类型名字还没有被宣布。“但是,在相同的第二个文件中定义的类型可以正确导入和使用。 – waltergu 2014-10-27 10:32:06

+0

如果没有你的实际代码,我不能告诉你更多的东西,但要编译“-warn all”。 – credondo 2014-10-27 11:18:45

+0

我不知道该说什么......似乎突然一切正常,进口声明。非常感谢你。 – waltergu 2014-10-27 15:22:13