एक किले के साथ बातचीत करते हुए 77 सबराउटिन परिणाम कोड के साथ "अवैध स्मृति पहुंच" त्रुटि में परिणाम जो मैंने नीचे संक्षेप में दिया है:
subroutine mysub1()
parameter :: kk=22
real, dimension(KK) :: A
call F77SUB(A)
end
subroutine mysub2()
parameter, integer :: kk=22
real, dimension(:,:), allocatable :: A
integer :: jj
jj = 12
allocate(A(kk,jj))
call F77SUB(A(:,1)) ! ERROR: Invalid memory access
end
जहां F77SUB फोर्टन सबराउटिन है, मैं उपयोग करने की कोशिश कर रहा हूं, जो 1 डी सरणी लेता है और इसे लिखता है। उपरोक्त कोड में, mysub1
काम करता है लेकिन mysub2
नहीं करता।
क्या कोई सुझाव दे सकता है कि समस्या क्या है, याएफ 0 9 0 और एफ 77 सबराउटिन के बीच वास्तव में सरणी तर्क कैसे पारित किए जाते हैं, इस बारे में विवरण प्रदान करें? मैंने एफ 77 सबराउटिन को पारित होने वाले स्केलरों के उदाहरण देखे हैं जो स्पष्ट रूप से केवल एक सरणी की शुरुआत होने के लिए स्केलर का मेमोरी पता लेते हैं। किसी भी ज्ञान की सराहना की जाएगी।
उत्तर:
उत्तर № 1 के लिए 1एक टिप्पणी के लिए बहुत लंबा है, लेकिन काफी जवाब नहीं है ..
आपके द्वारा पोस्ट किया गया कोड पागल है, और कोशिश कर रहा हैएक सारांशित कोड को ठीक करना एक फलहीन कार्य है, इसलिए मैंने इसे लंबे समय तक खर्च नहीं किया। यहां कुछ गंभीर त्रुटियां हैं, कृपया हमें यह बताकर जवाब न दें कि आपके "असली" कोड में त्रुटियां अनुपस्थित हैं।
F77SUB(A(:,1))
एक subroutine बुलावा के लिए वाक्य रचनात्मक रूप से गलत है,call F77SUB(A(:,1))
सही है।- एक सरणी आवंटित जिसे आवंटित करने के लिए घोषित नहीं किया गया है, इसकी अनुशंसा नहीं की जाती है।
- प्रक्रिया तर्क देना एक स्पष्ट है
intent
अनुशंसा की जा रही है। - फोरट्रान 9 0 के बीच आप जो डिचोटोमी आकर्षित करते हैंFORTRAN77 दिनचर्या भ्रामक है। यदि आपका कंपाइलर फोरट्रान 9 0 संकलित कर सकता है (और यह सक्षम होना चाहिए या आपके पास कोई आवंटन नहीं होगा) तो आप अपने कोड को केवल साधारण फोरट्रान के रूप में सोचने से बेहतर हैं।
जवाब के लिए 0 № 2
मुझे समस्या मिली। मैं 1 डी ए को डबल परिशुद्धता और 2 डी ए वास्तविक होने की घोषणा कर रहा था। किसी भी तरह से यह मुझे शिकायत के बिना F77 दिनचर्या दोनों को पास करने देता है।