मैं वर्तमान में फोरट्रान में थोड़ी सबराउटिन को कोड करने की कोशिश कर रहा हूं, जब मेरे प्रोग्राम में कोई त्रुटि आती है, यानी फ़ाइल लोड करने में विफल रहता है या एक असीमित आवश्यक फ़ाइल। इस बिंदु पर, निष्पादन को समाप्त कर दिया जाना चाहिए, लेकिन सभी आवंटन आवश्यक रूप से आवंटित नहीं किए जाते हैं (यह इस बात पर निर्भर करता है कि त्रुटि कहां दिखाई दे रही है), इसलिए मैं उन सभी को हटाने का क्लीनअप नहीं कर सकता।फोरट्रान डीलोकेट
SUBROUTINE Cleanup(A)
REAL(8), ALLOCATABLE, DIMENSION(:) :: A
IF (ALLOCATED(A)) THEN
DEALLOCATE(A)
END IF
END SUBROUTINE
और हर allocatable के लिए "सफाई" कहते हैं:
मेरे वर्तमान दृष्टिकोण पीछा कर रहा है। इसके साथ समस्या यह है कि मेरे सभी चर आयाम -1 नहीं हैं। उनमें से कुछ में मेरे पास तीन आयाम हैं।
मैंने पहले विभिन्न आयामों के लिए 3 अलग-अलग सबराउटिन लिखने और ओवरलोडिंग का उपयोग करने के बारे में सोचा था, लेकिन यह बहुत ही सुरुचिपूर्ण प्रतीत नहीं होता है।
फिर यह मेरे दिमाग में आया कि शायद मैं एक तर्ककर्ता को एक्ट्यूवल तर्क ए के बजाय पास कर सकता हूं, लेकिन मैंने गुमराह किया है और ऐसा लगता है कि आप एक लक्ष्य परिवर्तक को एक पॉइंटर को हटा नहीं सकते हैं।
इस बारे में कोई विचार सही तरीके से कैसे करें?
धन्यवाद।
निष्पादन समाप्त होने पर, आपके कोड द्वारा उपयोग किए जाने वाले सभी संसाधन स्वचालित रूप से किसी भी तरह से मुक्त हो जाते हैं, इसलिए आपको उन्हें स्पष्ट रूप से अस्वीकार करने की चिंता करने की आवश्यकता नहीं है। –
मुझे पता है कि फोरट्रान स्वचालित रूप से स्मृति को मुक्त करता है, लेकिन इस मामले में मैं एक डीएल लिख रहा हूं जिसे लैबव्यू से बुलाया जाता है, इसलिए यह स्मृति का प्रबंधन कर रहा है। जब डीएलएल किसी त्रुटि में आता है, तो लैबव्यू अचानक बंद हो जाता है, और यदि मैं फिर से निष्पादित करने का प्रयास करता हूं, तो यह संदेश दिखाएगा: "ऐरे पहले ही आवंटित है" और बंद हो जाता है। इसका मतलब है कि स्मृति को ठीक से हटाया नहीं जा रहा है। – derkomai
नोट: 'असली (8)' 8 बाइट होने की गारंटी नहीं है। 64 बिट्स के लिए एक पोर्टेबल तरीका 'ISO_FORTRAN_ENV',' असली (असली 64) 'का उपयोग करें। –