2012-11-21 41 views
5

पर विचार करें:क्या एक स्पष्ट इंटरफ़ेस के बिना एक नियमित रूप से एक आवंटित सरणी को पार करने में कुछ गड़बड़ है?

program main 
real, allocatable, dimension(:) :: foo 
integer n 
n=10 
call dofoo(foo,n,1) 
allocate(foo(n)) 
call dofoo(foo,n,0) 
end program main 

subroutine dofoo(foo,n,mode) 
real foo(n) 
integer i,n,mode 
if(mode.eq.1)then 
    n=6 
    return 
endif 
do i=1,n 
    foo(i)=i 
enddo 
return 
end subroutine dofoo 

क्या इसके बाद के संस्करण कोड के साथ गलत है? (यह gfortran के साथ काम करता है) मैं पहली बार एक गैर आवंटित सरणी में गुजरता हूं, लेकिन मैं इसे छूता नहीं - क्या मानक में कुछ भी है जो इसे सिस्टम पर निर्भर तरीके से व्यवहार कर सकता है?

उत्तर

5

आपने लगभग अपने प्रश्न का उत्तर दिया है। हां, मानक के अनुसार, यदि आपके पास दायरे में कोई इंटरफ़ेस नहीं है तो एक गैर-आवंटित आवंटनीय सरणी को वास्तविक तर्क के रूप में पारित करना हमेशा गैरकानूनी होता है।

यदि आपके पास दायरे में एक इंटरफ़ेस है तो यह केवल कानूनी है यदि डमी तर्क भी आवंटित है।

और हाँ मुझे इसकाट दिया गया है। मेरे काम को कॉल से पहले शून्य आकार में आवंटित किया गया है।

+0

धन्यवाद। मैं चिंतित था कि यह मामला था। मुझे नहीं पता था कि मानक क्या कहना है (मैं f77 मानक से बहुत परिचित हूं, लेकिन मैंने वास्तव में अधिकांश f90 मानक नहीं पढ़ा है) – mgilson

+0

एक साइड नोट के रूप में, उपरोक्त कोड gfortran के साथ काम करता है (मेरे बाद बग को संपादित किया गया) – mgilson

+3

आवंटित सरणी के चारों ओर पास करने से एफ 5 मानक तक टीआर तक साफ़ नहीं किया गया था। आवंटित स्थिति और आयाम आवंटित सरणी चर के _part_ हैं। यह मायने रखता है क्योंकि इरादे (इन) या इरादे (आउट) जैसी चीजें आपको बताती हैं कि अगर सरणी का _values_ बदल सकता है लेकिन क्या इसका आकार या आवंटन स्थिति बदल सकती है। एक स्पष्ट इंटरफ़ेस के बिना, एक प्रोग्राम को आवंटित सरणी को पार करते समय सबसे खराब मानना ​​होगा - यह बदले में आकार को और भी नहीं जान सकता है। सामान्य मामले में यह एक बड़ा प्रदर्शन जुर्माना है, इसलिए यह निर्णय लिया गया कि किसी के पास स्पष्ट इंटरफ़ेस होना चाहिए। –