2012-02-03 17 views
7

एक बार से अधिक मान लीजिए मैं एक मॉड्यूल जो इस तरह के कुछ बुनियादी स्थिरांक को परिभाषित करता हैएक मॉड्यूल

integer, parameter :: i8 = selected_int_kind(8) 

के रूप में अगर मैं अपने मुख्य कार्यक्रम में यह शामिल हैं और मैं भी एक मॉड्यूल जो कुछ अन्य काम करता है शामिल है (यह फोन भी शामिल है मॉड्यूल functions) लेकिन functions भी use एस constants, तो क्या मैं अनिवार्य रूप से constants को अपने मुख्य कार्यक्रम में दो बार शामिल कर रहा हूं?

यदि हां, तो क्या यह बुरा है? क्या कार्यक्रम में मॉड्यूल को कई बार शामिल करना खतरनाक हो सकता है?

+1

नहीं, ऐसा करना ठीक है। आप 'उपयोग' कथन के साथ कर रहे हैं वे सबप्रोग्राम स्कोप में चर ला रहे हैं। यह हर बार 'उपयोग' किए जाने वाले चर घोषित करने की तरह नहीं है। सावधान रहना एकमात्र चीज है * परिपत्र निर्भरता *, जहां मॉड्यूल 'ए' मॉड्यूल 'बी' का उपयोग करता है और मॉड्यूल 'बी 'मॉड्यूल' ए' का उपयोग करता है। इसकी अनुमति नहीं है। – Chris

+1

धन्यवाद, इसे एक उत्तर दें ताकि मैं आपको एक चेक मार्क दे सकूं! – drjrm3

+0

धन्यवाद, मैंने कुछ और जानकारी भी की है और जोड़ा है। – Chris

उत्तर

11

नहीं, यह करना ठीक है। आप use कथन के साथ कर रहे हैं, के माध्यम से अपने मॉड्यूल में परिभाषित चर और कार्यों तक पहुंच प्रदान कर रहा है का उपयोग करें। यह हर बार use 'डी (वे वास्तव में फिर से अव्यवस्थित हैं) वेरिएबल घोषित करने की तरह नहीं है।

केवल एक चीज को सावधान रहने की की परिपत्र निर्भरता, जहां मॉड्यूल A मॉड्यूल B उपयोग करता है और मॉड्यूल B मॉड्यूल A का उपयोग करता है। इसकी अनुमति नहीं है।

संपादित करें: मेटकाफ एट अल से। फोरट्रान 95/2003 समझाया, पृष्ठ। 72:

एक मॉड्यूल में use कथन शामिल हो सकते हैं जो अन्य मॉड्यूल तक पहुंचते हैं। इसे use कथन की श्रृंखला के माध्यम से सीधे या अप्रत्यक्ष रूप से एक्सेस नहीं करना चाहिए, उदाहरण के लिए ab और ba तक पहुंचने के लिए उपयोग नहीं करना चाहिए।

जबकि यह उद्धरण सीधे आपके प्रश्न का उत्तर नहीं देता है, यह दोहराता है कि वास्तव में केवल एक चीज जो आप नहीं कर सकते हैं वह एक परिपत्र निर्भरता है। तो निम्नलिखित पूरी तरह से मान्य है:

module one_def 
    implicit none 
    integer, parameter :: one=1 
end module one_def 

module two_def 
    use one_def, only : one 
    implicit none 
    integer, parameter :: two=one+one 
end module two_def 

program test 
    use one_def, only : one 
    use two_def, only : two 
    implicit none 

    print*, two == one+one ! This prints .True. 

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