2012-03-12 13 views
5

में टाइप-बाउंड फ़ंक्शन ओवरलोडिंग मेरे पास एक फोरट्रान व्युत्पन्न प्रकार टी है जिसमें विभिन्न रैंकों और प्रकारों के डेटा सरणी शामिल हैं। इन सरणियों एक जटिल डेटा संरचना के अंदर छिपे हुए हैं और मैं इस बात का एक गेटर समारोह करना चाहते हैं निम्नलिखित है:फोरट्रान 2003

a => T%get(data_id) 

जहां "एक" दिए गए प्रकार की एक सरणी सूचक है, और 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) 

जो मुझे बहुत कम पठनीय लगता है। क्या उन कार्यों को अधिभारित करने का कोई तरीका है जिनके पास समान तर्क सूची है लेकिन अलग-अलग रिटर्न प्रकार हैं? या मुझे इसके लिए subroutines का उपयोग करना है?

+1

मुझे लगता है कि संकलक के लिए केवल सही प्रकार के आधार पर सही फ़ंक्शन को समझना मुश्किल होगा, इसलिए यह संभवतः असंभव है। मैं सिर्फ subroutines का उपयोग करेंगे। – bdforbes

उत्तर

5

जब एक (सूचक) असाइनमेंट स्टेटमेंट फोर्टन में निष्पादित हो जाता है, तो असाइनमेंट होने से पहले दाईं ओर हमेशा पक्ष का मूल्यांकन किया जाता है। यह स्वतंत्र रूप से बाईं ओर से होता है, इसलिए कोई भी तरीका नहीं है कि एलएचएस आरएचएस के मूल्यांकन के नतीजे को प्रभावित कर सके। यह भाषा जिस तरह से डिजाइन की गई है।

+0

अरे ... लेकिन वैसे भी धन्यवाद! – calys

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  

आशा इस मदद करता है।