2012-03-12 48 views
5

超載我有一個包含的(許多)不同的等級和類型的數據陣列的Fortran派生類型T。這些陣列複雜的數據結構內隱藏和我想有一個吸氣函數執行以下操作:類型結合的功能在2003年的Fortran

a => T%get(data_id) 

其中「a」是給定類型的數組的指針,和data_id是一個整數,它是用於查找數據結構中的數據。我這樣做,通過在一個通用名重載許多「get_thistype()」函數。

TYPE T 
    PROCEDURE :: get_real 
    PROCEDURE :: get_integer 
    GENERIC :: get => get_real,get_integer 
END TYPE 

這工作如果get_thistype()例程子程序,但如果他們被寫成函數。這意味着我的代碼如下所示:

CALL T%get(a,data_id) 

我發現它的可讀性差得多。有沒有辦法重載具有相同參數列表但不同返回類型的函數?或者我必須使用子例程嗎?

+1

我認爲編譯器很難根據返回類型找出正確的函數,所以這可能是不可能的。我只會使用子例程。 – bdforbes 2012-03-12 22:41:13

回答

5

當(指針)賦值語句在FORTRAN被執行,右手邊總是被評估的轉讓發生前充分。出現這種情況獨立於左側的,所以絕對沒有辦法的是,LHS可以影響RHS的評估結果。這只是語言設計的方式。

+0

該死的......但我還是謝謝你! – calys 2012-03-13 07:16:45

0

我只是碰到這個帖子來了,所以對任何人的利益看到這個未來:

如果我理解正確的問題,你可以通過重載賦值運算符做到這一點。例如:

文件X.f90:

MODULE XModule 

TYPE :: X 
    INTEGER, DIMENSION(:), POINTER :: IntArray 
    REAL, DIMENSION(:), POINTER :: RealArray 
END TYPE 

INTERFACE ASSIGNMENT (=) 
    MODULE PROCEDURE PointToInt 
    MODULE PROCEDURE PointToReal 
END INTERFACE 

CONTAINS 

SUBROUTINE PointToInt(Ip, V) 
    INTEGER, POINTER, DIMENSION(:), INTENT(OUT) :: Ip 
    TYPE(X), INTENT(IN) :: V 
    Ip => V%IntArray 
END SUBROUTINE PointToInt 

SUBROUTINE PointToReal(Rp, V) 
    REAL, POINTER, DIMENSION(:), INTENT(OUT) :: Rp 
    TYPE(X), INTENT(IN) :: V 
    Rp => V%RealArray 
END SUBROUTINE PointToReal 

END MODULE 

測試驅動程序文件Driver.f90:

PROGRAM Driver 
USE XModule 
TYPE(X) :: Var 
INTEGER, DIMENSION(:), POINTER :: I 
REAL, DIMENSION(:), POINTER :: R 

ALLOCATE(Var%IntArray(2)) 
ALLOCATE(Var%RealArray(3)) 

Var%IntArray = [1, 2] 
Var%RealArray = [1., 2., 3.] 

I = Var 
PRINT*, I 

R = Var 
PRINT*, R 

END PROGRAM 

輸出:

  1   2 
    1.000000  2.000000  3.000000  

希望這有助於。