2015-03-04 7 views
6

मुझे अपने कोड को चलाने के दौरान फोर्टन रनटाइम चेतावनी "एक सरणी अस्थायी बनाया गया" मिलता है (gfortran के साथ संकलित) और मैं जानना चाहता हूं कि इस चेतावनी को हल करने का कोई बेहतर तरीका है या नहीं।फोरट्रान रनटाइम चेतावनी: अस्थायी सरणी

allocate(flx_est(lsign,3)) 
allocate(flx_err(lsign,3)) 
do i=1,lsign 
call combflx_calc(flx_est(i,:),flx_err(i,:)) 
enddo 

सबरूटीन अंदर मैं इस तरह चर निर्धारित:

मेरे मूल कोड कुछ इस तरह है

subroutine combflx_calc(flx_est,flx_err) 
use,intrinsic    :: ISO_Fortran_env, only: real64 
implicit none 
real(real64),intent(inout) :: flx_est(3),flx_err(3) 

flux_est और flx_err वैक्टर कई शर्तों के आधार पर सबरूटीन के अंदर बदल सकते हैं और मुझे तदनुसार उनके मूल्यों को अपडेट करने की आवश्यकता है।

फ़ोरट्रान इस संरचना को पसंद नहीं करता है। मैं इसे अस्थायी चर परिभाषित कर सकता हूं:

tmp_flx_est=flx_est(i,:) 
tmp_flx_err=flx_err(i,:) 
call combflx_calc(tmp_flx_est,tmp_flx_err) 
flx_est(i,:)=tmp_flx_est 
flx_err(i,:)=tmp_flx_err 

लेकिन ऐसा लगता है कि यह मुझे ठीक करने का एक मूर्ख तरीका है।

जैसा कि आप देख सकते हैं कि मैं फोरट्रान के साथ एक विशेषज्ञ नहीं हूं, इसलिए कोई भी सहायता स्वागत से अधिक है।

+2

आपके "फिक्स" को कुछ भी ठीक करने का तरीका क्या है? अस्थायी अभी भी है, आप इसे मैन्युअल रूप से बना रहे हैं। –

+0

फिक्सिंग नहीं, मास्किंग बेहतर है। मुझे अपने शुरुआती दृष्टिकोण के संभावित नुकसान को नहीं देखा गया था इसलिए मैं चेतावनी – cardogar

+0

से छुटकारा पाना चाहता था, मैं असहमत हूं कि मास्किंग फिक्सिंग से बेहतर है। यदि आप मास्क करना चाहते हैं तो आप रनटाइम जांच सक्षम करने के साथ संकलित नहीं कर सकते हैं। – casey

उत्तर

9

एक तरीका यह एक कल्पित आकार सरणी

real(real64),intent(inout) :: flx_est(:),flx_err(:) 

अन्य अपने सरणी के आयाम का आदान प्रदान करने, ताकि आप 2 डी सरणी का एक सन्निहित अनुभाग से पारित सकता है पारित करने के लिए है।

call combflx_calc(flx_est(:,i),flx_err(:,i)) 

समस्या यह है कि स्पष्ट आकार अपने प्रक्रिया (var(n)) की डमी तर्क सन्निहित सरणियों की आवश्यकता है। माना गया आकार सरणी कुछ stride हो सकता है।

+0

वास्तव में जब मैं अनुमानित आकार के तर्कों का उपयोग करता हूं तो मुझे "त्रुटि: 'combflx_calc' के लिए स्पष्ट इंटरफ़ेस की आवश्यकता होती है (1): अनुमानित-आकार तर्क"। लेकिन आयामों का आदान-प्रदान हालांकि काफी बड़ा और कठिन काम है। आपके विचारों के लिए धन्यवाद! – cardogar

+0

इसका मतलब है कि यह क्या कहता है। आपके पास स्पष्ट इंटरफ़ेस होना चाहिए। सभी प्रक्रियाओं को एक मॉड्यूल में रखा जाना चाहिए। –

+0

मैंने किया: 'इंटरफ़ेस सबरूटीन combflx_calc (flx_est, flx_err) उपयोग, आंतरिक :: ISO_Fortran_env, केवल: real64 असली (real64), आशय (inout) :: flx_est (:), flx_err (:) अंत सबरूटीन combflx_calc एंड इंटरफ़ेस ' ऐसा चेतावनी के बिना काम करता प्रतीत होता है, क्या आपको लगता है कि यह सही है? – cardogar

6

आपकी सरणी अस्थायी बनाई जा रही है क्योंकि आप अपने सबराउटिन में एक स्ट्रिंग सरणी पार कर रहे हैं। फोरट्रान सरणी स्तंभ प्रमुख हैं इसलिए बाएं सबसे सूचकांक एक सरणी में सबसे तेज़ होता है, या बेहतर कहा जाता है, बाएं सबसे सूचकांक स्मृति में संगत होता है और दाईं ओर प्रत्येक चर बाईं ओर से होता है।

जब आप

call combflx_calc(flx_est(i,:),flx_err(i,:)) 

फोन इन स्लाइस अपने 3-वेक्टर lsign की लंबाई से strided की सरणियों कर रहे हैं। Subroutine स्मृति में एक आयाम के चर के चर की अपेक्षा करता है, जिसमें आप जिस चर को पार करते हैं वह नहीं है। इस प्रकार, subroutine पर काम करने के लिए एक अस्थायी बनाया जाना चाहिए और फिर अपने सरणी टुकड़े में वापस कॉपी किया जाना चाहिए।

आपका "फिक्स" यह नहीं बदलता है, यह अब अस्थायी के बारे में चेतावनी नहीं देता है क्योंकि आप रनटाइम के बजाए इसे स्पष्ट रूप से बनाए गए चर का उपयोग कर रहे हैं।

व्लादिमीर का जवाब आपको अस्थायी से बचने के विकल्प देता है, इसलिए मैं उन्हें यहां डुप्लिकेट नहीं करूंगा।

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