2014-10-27 92 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