2011-12-23 11 views
22

में फ़ंक्शन नाम को उपनाम कैसे करें यह सुनिश्चित नहीं है कि शीर्षक अच्छी तरह से रखा गया है या नहीं। सुझाव स्वागत है।फोरट्रान

यहां मैं क्या करना चाहता हूं। एक शर्त जांचें, और फिर तय करें कि लूप में किस फ़ंक्शन का उपयोग करना है। उदाहरण के लिए:

if (a < 0) then 
    loop_func = func1 
else 
    loop_func = func2 
endif 

मैं तो एक सूचक के रूप में loop_func का उपयोग जब मेरे पाश लिख सकता है। दोनों कार्य वास्तव में एक ही इनपुट लेते हैं, और a के मूल्य के आधार पर समस्या से निपटने के लिए अलग-अलग दृष्टिकोण हैं। इससे मुझे लगभग दो समान ब्लॉक के बजाय कोड का केवल एक ब्लॉक होना होगा। यह subroutines पर भी लागू हो सकता है।

कोई विचार यह कैसे लागू किया जा सकता है?

धन्यवाद।

उत्तर

31

हां, फोरट्रान में प्रक्रिया पॉइंटर्स हैं, इसलिए आप असल में फ़ंक्शन नाम का उपयोग कर सकते हैं। यहां एक कोड उदाहरण है जो फ़ंक्शन पॉइंटर "f_ptr" को एक फ़ंक्शन या अन्य को असाइन करता है। उसके बाद कार्यक्रम "f_ptr" का उपयोग कर सकता है और चयनित फ़ंक्शन लागू किया जाएगा।

module ExampleFuncs 

    implicit none 

contains 

function f1 (x) 
    real :: f1 
    real, intent (in) :: x 

    f1 = 2.0 * x 

    return 
end function f1 


function f2 (x) 
    real :: f2 
    real, intent (in) :: x 

    f2 = 3.0 * x**2 

    return 
end function f2 

end module ExampleFuncs 


program test_func_ptrs 

    use ExampleFuncs 
    implicit none 

    abstract interface 
     function func (z) 
     real :: func 
     real, intent (in) :: z 
     end function func 
    end interface 

    procedure (func), pointer :: f_ptr => null() 

    real :: input 

    write (*, '(/ "Input test value: ")', advance="no") 
    read (*, *) input 

    if (input < 0) then 
     f_ptr => f1 
    else 
     f_ptr => f2 
    end if 

    write (*, '(/ "evaluate function: ", ES14.4)') f_ptr (input) 

    stop 

end program test_func_ptrs 
+0

इसके लिए क्या बोलीभाषा है? – wallyk

+0

हम्म ... तो '=>' पॉइंटर्स के लिए किसी प्रकार का असाइनमेंट ऑपरेटर है, और 'प्रक्रिया (func) 'प्रक्रियाओं के लिए किसी प्रकार की घोषणा है, जैसे' प्रकार (mytype)' व्युत्पन्न प्रकारों के लिए है। मुझे लगता है कि 'शून्य() 'प्रारंभिकरण के लिए उपयोग किया जाता है और 0 के बराबर है। जैसा कि आप बता सकते हैं कि मैं इस पर शुरुआत कर रहा हूं।और हाँ, फोरट्रान पहली प्रोग्रामिंग भाषा है जिसे मैं ठीक से सीख रहा हूं। –

+0

कुछ प्रश्न। के लिए 'इंटरफेस' क्या है? क्या यह एक प्रक्रिया निर्दिष्ट करने का तरीका है (फिर से, व्युत्पन्न प्रकार की तरह), और यह सुनिश्चित करने के लिए कि पॉइंटर क्या इंगित कर रहा है सही "प्रकार" है? साथ ही, आपके प्रोग्राम के अंत से पहले आपके पास 'स्टॉप' है। क्या यह सबसे अच्छा अभ्यास है, और क्या मुझे अपने कोड में भी शामिल करना चाहिए? –

2

अधिकांश फोरट्रान कार्यान्वयन में फ़ंक्शन पॉइंटर्स या प्रक्रिया पॉइंटर्स में हेरफेर करने का मानक तरीका नहीं है। हालांकि, फोरट्रान 2003 और बाद में कुछ है। (this के पृष्ठ 6 देखें।)

किसी परिस्थिति के लिए, यह अपनी जगह पर बहुत अच्छी तरह से काम करेगा: इसके बजाय आप loop_func साथ क्या किया होता की अतिरिक्त पैरामीटर के साथ

function func1 (p1, p2, etc) 
... as you have it already 
end 

function func2 (p1, p2, etc) 
... as you have it already 
end 

function funcselect (a, p1, p2, etc) 
    if (a < 0) then 
      x = func1 (p1, p2, etc) 
    else 
      x = func2 (p1, p2, etc) 
    endif 
end 

तो बस फोन funcselect

+0

लेकिन क्या कार्यक्रम को हर बार कार्य करने की स्थिति को जांचना नहीं होगा? मैं इससे बचने की कोशिश कर रहा हूं। –

+0

@ सैमुएलटान: हाँ, लेकिन इसके बारे में चिंता करने के लिए शायद ही कुछ भी है। किसी भी आधुनिक प्रोसेसर पर, यह केवल कुछ सीपीयू चक्र हैं: कुछ हनोसेकंड्स का मुट्ठी भर। – wallyk

+2

मैं इस कथन से असहमत हूं कि "फोरट्रान के पास फ़ंक्शन पॉइंटर्स या प्रक्रिया पॉइंटर्स में हेरफेर करने का मानक तरीका नहीं है।" प्रक्रिया पॉइंटर्स फोरट्रान 2003 भाषा मानक का हिस्सा हैं। –

संबंधित मुद्दे