2012-10-24 12 views
11

में सबराउटिन के लिए आवंटित सरणी कैसे पास करें निम्न कोड एक सेगमेंटेशन फॉल्ट लौटा रहा है क्योंकि आवंटित सरणी जिसे मैं पास करने का प्रयास कर रहा हूं उसे ठीक से पहचाना नहीं जा रहा है (आकार रिटर्न 1, जब यह 3 होना चाहिए)। इस पृष्ठ में (http://www.eng-tips.com/viewthread.cfm?qid=170599) एक समान उदाहरण यह इंगित करता है कि इसे F95 में ठीक काम करना चाहिए; मेरी कोड फ़ाइल में एक एफ 0 9 0 एक्सटेंशन है, लेकिन मैंने इसे F95 में बदलने की कोशिश की, और मैं संकलन करने के लिए gfortran का उपयोग कर रहा हूँ।फोरट्रान

मेरा अनुमान है कि समस्या इस तरह से होनी चाहिए कि मैं subroutine को आवंटित सरणी को पार कर रहा हूं; मैं क्या गलत कर रहा हूं?

!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! 
PROGRAM test 
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! 
IMPLICIT NONE 
DOUBLE PRECISION,ALLOCATABLE :: Array(:,:) 
INTEGER      :: iii,jjj 

ALLOCATE(Array(3,3)) 
DO iii=1,3 
DO jjj=1,3 
    Array(iii,jjj)=iii+jjj 
    PRINT*,Array(iii,jjj) 
ENDDO 
ENDDO 
CALL Subtest(Array) 

END PROGRAM 
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! 
SUBROUTINE Subtest(Array) 
DOUBLE PRECISION,ALLOCATABLE,INTENT(IN) :: Array(:,:) 
INTEGER         :: iii,jjj 

PRINT*,SIZE(Array,1),SIZE(Array,2) 
DO iii=1,SIZE(Array,1) 
DO jjj=1,SIZE(Array,2) 
    PRINT*,Array(iii,jjj) 
ENDDO 
ENDDO 

END SUBROUTINE 
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! 
+0

ध्यान दें कि आवंटित डमी तर्क वास्तव में एक हैं (व्यापक रूप से समर्थित - कुछ वर्षों के लिए gfortran सहित) फोरट्रान 2003 सुविधा। – IanH

उत्तर

28

एक प्रक्रिया एक डमी तर्क एक allocatable, तो एक स्पष्ट इंटरफेस किसी भी बुला दायरे में आवश्यक है कि है।

आपको लगता है कि स्पष्ट इंटरफेस प्रदान कर सकते हैं अपने आप को मुख्य कार्यक्रम के अंदर अपने सबरूटीन के लिए एक इंटरफेस ब्लॉक डालकर (ऐसे कई बातें एक स्पष्ट इंटरफेस की आवश्यकता है कि कर रहे हैं, एक allocatable डमी लेकिन एक है।)। एक वैकल्पिक और दूर, दूर, कहीं बेहतर विकल्प मॉड्यूल के अंदर सबराउटिन डालना है और फिर मुख्य प्रोग्राम में उस मॉड्यूल का उपयोग करना है - स्पष्ट इंटरफ़ेस स्वचालित रूप से बनाया जाता है। इस बारे में एक उदाहरण है जिस पर आपने एक लिंक प्रदान किया है - xwb द्वारा पोस्ट देखें। भी अपनी स्थिति को क्वेरी, यह पुनः निर्दिष्ट करें, यह पुनःआवंटन, आदि

+0

धन्यवाद, यह मेरी समस्या थी। मुझे पता था कि कुछ फ़ंक्शंस (उनके नाम पर याद नहीं है, लेकिन मुझे लगता है कि वे इनपुट पैरामीटर बदल चुके थे) स्पष्ट इंटरफेस की आवश्यकता थी, लेकिन पता नहीं था कि आवंटन वही था। और हाँ, कोड मेरे असली कोड डीबग करने के उद्देश्य से बनाया गया था। – Nordico

5

कृपया -

ध्यान दें कि यह केवल एक डमी तर्क के लिए समझ में आता है allocatable विशेषता अगर आप अपनी आवंटन स्थिति से संबंधित कुछ करने के लिए जा रहे हैं के लिए ध्यान दें कि आपके आवंटनीय डमी तर्क array को intent(in) के साथ घोषित किया गया है, जिसका अर्थ है कि इसकी आवंटन स्थिति संबंधित वास्तविक तर्क की होगी (और प्रक्रिया के दौरान इसे बदला नहीं जा सकता है)। आपके सबराउटिन को पारित वास्तविक तर्क को एक स्पष्ट इंटरफ़ेस के साथ भी संदर्भित करने के लिए अवैध और इसलिए गैरकानूनी हो सकता है। कंपाइलर इसे नहीं जानता और size जैसे पूछताछ का व्यवहार ऐसे मामलों में अपरिभाषित है।

इसलिए, आपको पहले इसकी सामग्री को संदर्भित करने से पहले के allocated(array) के आवंटन स्थिति की जांच करनी होगी।

subroutine subtest(array) 
    double precision, allocatable, intent(in) :: array(:,:) 
    integer         :: iii, jjj 

    if(allocated(array)) then 
    print*, size(array, 1), size(array, 2) 
    do iii = lbound(array, 1), ubound(array, 1) 
     do jjj = lbound(array, 2), ubound(array, 2) 
     print*, array(iii,jjj) 
     enddo 
    enddo 
    endif 
end subroutine 
+0

नोट: इसे एक नए उत्तर के रूप में जोड़ा गया क्योंकि मैं अभी तक दूसरों पर टिप्पणी नहीं कर सकता हूं। यह इयानएच के जवाब का एक विस्तार है जो मुझे लगता है कि महत्वपूर्ण है, क्योंकि यह subtlety भी engwtips.com पर xwb के पोस्ट में चूक गया है। मैं एक बड़े संपादन के साथ बाध्य नहीं करना चाहता था; हालांकि इसे एक जवाब में विलय करने के लिए स्वतंत्र महसूस करें। – sigma

+0

उबाउंड आकार के समान प्रभाव प्रतीत होता है; अंतर क्या है? और अगर एक सरणी 1 से अधिक सूचकांक के साथ शुरू होता है तो लाउंड का उपयोग होता है? क्या ऐसा हो सकता है? – Nordico

+3

'आकार' किसी सरणी के तत्वों (एक मंद तर्क के बिना) या किसी भी आयाम के साथ संख्या (एक मंद तर्क के साथ) देता है।आप सीमाओं के साथ सरणी आवंटित कर सकते हैं '(-2: 0, -2: 0) 'और आकार प्रत्येक आयाम के साथ अभी भी 3 होगा, लेकिन' सरणी (1: 3, 1: 3) 'अपरिभाषित है। यह अनुमानित आकार के साथ गैर-आवंटनीय डमी सरणी के विपरीत है, जहां निचली बाउंड वास्तव में निर्दिष्ट नहीं होने पर 1 माना जाता है। – sigma

1

यह एक सरल उदाहरण एक साथ allocatable डमी तर्क का उपयोग करता है: मैं आगे, lbound और ubound के साथ पूर्ण सरणी पर छोरों को लागू करने के बाद से सामान्य रूप में आप array की सीमा के बारे में निश्चित नहीं किया जा सकता सुझाव है मॉड्यूल।

module arrayMod 
    real,dimension(:,:),allocatable :: theArray  
end module arrayMod 

program test 
    use arrayMod 
    implicit none 

    interface 
     subroutine arraySub 
     end subroutine arraySub 
    end interface 

    write(*,*) allocated(theArray) 
    call arraySub 
    write(*,*) allocated(theArray) 
end program test 

subroutine arraySub 
    use arrayMod 

    write(*,*) 'Inside arraySub()' 
    allocate(theArray(3,2)) 
end subroutine arraySub 
संबंधित मुद्दे