fortran90 - How could a simple optional argument lead to data corruption? -


मेरे पास एक फ़ोरट्रान कोड है जो नियमित है:

  SUBROUTINE READ_NC_VALS (NCID, RECID, VARNAME, VARDATA) पूर्णांक एनसीआईडी, रीकिड कैरेक्टर * (*) वर्नाम रिक्त * 8 वर्डाडेट वर्मान (15,45,75) आदि।   

मैं इस कोड के लिए कुछ लचीलापन जोड़ना चाहता हूं, और मैंने सोचा कि मैं इसे वैकल्पिक फ्लैग तर्क जोड़कर पहले करूँगा:

  SUBROUTINE READ_NC_VALS (NCID, RECID, VARNAME, VARDATA, how_to_calculate)! सब कुछ एक ही है और फिर ... तार्किक, वैकल्पिक :: how_to_calculate   

अब, इस बिंदु पर, मैं "how_to_calculate" का उपयोग भी नहीं कर रहा हूँ। मैं सिर्फ परीक्षण के लिए कोड में डाल रहा हूं। तो मैं एक कंजूस के बिना कोड संकलित करता हूं। तो मैं इसे चलाता हूँ, और मुझे सबस्ट्रैटन में एक त्रुटि मिलती है विशेष रूप से, बाद में कोड के कुछ मान "जादुई" हैं, जो उस वैकल्पिक तर्क के बिना थे। नए मान कोड का तर्क समझ में नहीं आता है, इसलिए यह त्रुटि संदेश के साथ विनम्रता से बाहर निकलता है। मुझे इस बात पर जोर देना चाहिए कि इस बिंदु पर, मैं इस वैकल्पिक तर्क का भी उपयोग नहीं कर रहा हूँ तो फिर, एक लवा पर, मैं उस स्रोत में सभी जगहों पर वापस जाता हूं जो कि इस रूटीन को कॉल करते हैं और, हालांकि वैकल्पिक में मेरी नई तर्क, मैंने इसके लिए सभी कॉलों में मूल्य डाल दिया जब मैं ऐसा करता हूँ, कोड ठीक चल रहा है। तो क्या चल रहा है? अन्य डेटा के दूषित होने के कारण एक उपवादात्मक परिणाम में एक अप्रयुक्त वैकल्पिक तर्क की उपस्थिति कैसे हो सकती है? और इस वैकल्पिक तर्क के लिए इनपुट पैरामीटर कैसे जोड़ सकते हैं, फिर से बातें तय करें? इसे पीजीआई के साथ संकलित किया जा रहा है।

कोई विचार? धन्यवाद।

बीटीडब्ल्यू, अधिक कोड प्रदान करने के लिए खेद है। मेरे बॉस मेरे साथ बहुत खुश नहीं हो सकता है अगर मैंने ऐसा किया मैं नियम नहीं बनाता; मैं सिर्फ यहां काम करता हूं।

फोरट्रान में वैकल्पिक तर्कों को 0 (एक अशक्त सूचक) प्रत्येक वैकल्पिक तर्क के लिए जो कॉलिंग सबरॉउटिन द्वारा प्रदान की गई कोई मूल्य नहीं है।

  • कॉलिंग सबरॉउटिन के अंदर एक स्पष्ट INTERFACE परिभाषा है
  • या एक मॉड्यूल-

    यदि आप एक सबरूटीन के लिए एक वैकल्पिक तर्क जोड़ते हैं लेकिन यह कॉलर में न तो एक इंटरफ़ेस है या मॉड्यूल-स्तर की सब-रूटिन नहीं है, तो कंपाइलर सही कॉलिंग अनुक्रम उत्पन्न नहीं करेगा - यह अपेक्षित से कम तर्क देगा यह यूनिक्स सिस्टम पर एक समस्या पैदा कर सकता है, जहां पीजीआई तर्क कोड के अंत में सभी CHARACTER * (*) तर्कों की लंबाई से गुजरता है (Windows पर यह पता के बाद अगली तर्क के रूप में लंबाई को गुजरता है) स्ट्रिंग का) एक लापता तर्क स्टैक में लंबाई के तर्कों को स्थानांतरित करेगा (या उन्हें x64 पर गलत रजिस्टरों में डाल दें) जिससे VARNAME स्ट्रिंग को READ_NC_VALS द्वारा प्राप्त किया जा रहा है। । यह सभी प्रकार के बीमार व्यवहारों को जन्म दे सकता है, अधिलेखित मेमोरी और "जादुई रूप से बदलते मूल्यों" को प्रोग्राम लॉजिक के अनुसार नहीं बदलना चाहिए।

Comments