[英]Type-bound function overloading in Fortran 2003
我有一個Fortran派生類型T,它包含(許多)不同等級和類型的數據數組。 這些數組隱藏在一個復雜的數據結構中,我想有一個getter函數,它執行以下操作:
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)
我發現它的可讀性要低得多。 有沒有辦法重載具有相同參數列表但返回類型不同的函數? 或者我必須使用子程序嗎?
當一個(指針)賦值語句在fortran中執行時,右側總是在賦值發生之前被完全評估。 這種情況獨立於左側發生,因此LHS絕對無法影響RHS評估的結果。 這就是語言設計的方式。
我剛剛看到這篇文章,所以為了任何人的利益,將來會看到這個:
如果我正確理解了這個問題,你可以通過重載賦值運算符來實現這個目的。 例:
文件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
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.