2010-09-30 11 views
18

में एक सरणी लौट रहा है यह मेरी समझ है कि आप फोरट्रान में किसी फ़ंक्शन से सरणी वापस कर सकते हैं, लेकिन किसी कारण से मेरा कोड केवल सरणी में पहला मान लौटा रहा है, मैं इसे वापस लौटने के लिए कह रहा हूं। इस समारोह है:फ़ंक्शन फ़ोर्रान

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

    polynomialMult = x(1:npts) + 1 

end function 

और यहां मैं यह

C(1:numPoints) = polynomialMult(numPoints,x,f) 

print *, C(1:numPoints)` 

फोन कर रहा हूँ इसे अभी कुछ भी उपयोगी नहीं करता है, क्योंकि मैं वाक्य रचना को समझने के लिए इससे पहले कि मैं तर्क बारे में कोशिश कर रहा हूँ । मैंने कार्यों के लिए प्रकार निर्दिष्ट करने के बारे में कुछ सामान देखा, लेकिन जब मैं

integer function polynomialMult(npts,x,y) 

या जो भी मुझे संकलन त्रुटि मिलती है।

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

! Change the next line to whatever you want 
    double precision, dimension(npts) :: polynomialMult 

    polynomialMult = x(1:npts) + 1 

end function 

आपका घोषणा

integer function polynomialMult(npts,x,y) 

वाणी समारोह एक पूर्णांक देता है कि:

उत्तर

25

एक समारोह जो एक सरणी देता है परिभाषित करने के लिए समारोह के अंदर समारोह घोषणा, इस तरह शामिल हैं। एक पूर्णांक, पूर्णांक की एक सरणी नहीं है। मुझे नहीं लगता कि मानक फ़ंक्शन घोषणाओं की अनुमति देता है जैसे:

integer, dimension(10) function polynomialMult(npts,x,y) 

लेकिन मैं गलत हो सकता था। मैं हमेशा आपके द्वारा दिखाए गए फॉर्म का उपयोग करता हूं।

यदि आपके पास फ़ोरट्रान कंपाइलर अद्यतित है तो आप चालाक चीजें कर सकते हैं जैसे कि आवंटित सरणी लौटाएं। और मेरा सुझाव है कि आप सरणी वाक्यविन्यास को समझें। उदाहरण के लिए, अपने बयान:

polynomialMult = x(1:npts) + 1 

अधिक संक्षेप में लिखा जा सकता है:

polynomialMult = x + 1 

के बाद से फोरट्रान की सरणी एक्स सभी तत्व है जो आप केवल npts तत्वों के लिए घोषणा की है अदिश अलावा नक्शा होगा।

सबराउटिन में सरणी के आकार को पास करना बहुत FORTRAN77 है और लगभग हमेशा अनावश्यक है। आम तौर पर आप या तो सरणी में प्रत्येक तत्व (जैसे सरणी वाक्यविन्यास उदाहरण में) पर काम करना चाहते हैं या आपको उपप्रोग्राम को उस सरणी के आकार को समझने देना चाहिए जिससे वह कार्य कर रहा है।

polynomialMult = x + 1 

हालांकि, जानते हुए भी कि polynomialMult और एक्स सरणियों हैं बिना, एक मान सकता है कि यह एक अदिश ऑपरेशन है:

+1

आपकी मदद के लिए धन्यवाद। जैसा कि आप शायद बता सकते हैं, मैं फोर्टन के लिए नया हूं। – Statler

3

मैं पिछले प्रत्युत्तर निम्नलिखित काम करता है उस के साथ सहमत हैं। मैं स्पष्ट होना पसंद करता हूं और इसे इस तरह से करता हूं:

polynomialMult(:) = x(:) + 1 

मैंने यह भी जोर दिया है कि मेरे समूह के कोडर इस तरह से ऐसा करते हैं। मैं किसी के कोड को समझने के लिए कड़ी मेहनत नहीं करना चाहता - मैं यह स्पष्ट करना चाहता हूं कि वे क्या कर रहे हैं।

+2

हाहा, इस सवाल पर लौट आया जब इसे एक और वोट मिला।इस उत्तर के साथ एक सूक्ष्म 'मुद्दा' है: 'polynomialMult' एक सरणी है और' polynomialMult (:) 'एक सरणी अनुभाग है और दोनों हमेशा एक दूसरे के बीच विनिमय नहीं होते हैं, हालांकि वे यहां हैं। –

+0

@HighPerformanceMark: मैं कुछ polynomialMult (1: npts) = x (1: npts) + 1' जैसा कुछ कहूंगा। तो इसमें कोई संदेह नहीं है, है ना? – jvriesem

+1

@jvriesem, यह इस बात पर निर्भर करता है कि 'polynomialMult' के सूचकांक कैसे सेट हैं। कभी-कभी गैर-मानक सूचकांक का उपयोग करने के अच्छे कारण होते हैं जैसे कि 'डबल सटीक बहुपद बहुमत (0: npts-1) '। उस स्थिति में आप 'polynomialMult (0: npts-1) = x (0: npts-1) + 1' के साथ बग को जोखिम देते हैं क्योंकि आप अभिव्यक्ति में सूचकांक को गलती से गलत टाइप कर सकते हैं। – astay13