簡體   English   中英

Fortran 2003中的類型綁定函數重載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM