2010-04-06 20 views
6

मेरी प्रोग्रामिंग भाषा कक्षा के लिए एक एचडब्ल्यू समस्या पूछता है:फोरट्रान 77 स्थिर या स्थिर गतिशील में स्थानीय चर हैं?

फ़ोरट्रान स्थिर या ढेर गतिशील में स्थानीय चर हैं? क्या स्थानीय वेरिएबल हैं जो डिफ़ॉल्ट मान स्थिर या स्थिर गतिशील हैं? मुझे अपने उत्तर का बैक अप लेने के लिए स्पष्टीकरण के साथ कुछ कोड दिखाएं। संकेत: यह जांचने का सबसे आसान तरीका यह है कि आपका प्रोग्राम उपप्रोग्राम की इतिहास संवेदनशीलता का परीक्षण करे। देखें कि जब आप स्थानीय चर को किसी मान पर प्रारंभ करते हैं और जब आप नहीं करते हैं तो क्या होता है। आत्मविश्वास के साथ अपने उत्तर को लॉक करने के लिए आपको एक से अधिक उपप्रोग्राम कॉल करने की आवश्यकता हो सकती है।

मैं कुछ सबरूटीन्स लिखा है: - एक चर बना सकते हैं - प्रिंट चर - एक मूल्य को चर इनिशिएलाइज़ - प्रिंट चर फिर

बाहर एक ही यादृच्छिक मान सबरूटीन प्रिंट करने के लिए प्रत्येक लगातार कॉल वैरिएबल के लिए जब यह अनियंत्रित होता है और फिर यह प्रारंभिक मान को प्रिंट करता है।

परिवर्तनीय अनियमित होने पर यह यादृच्छिक मूल्य क्या है?

क्या इसका मतलब है कि फोरट्रान प्रत्येक कॉल के लिए सबराउटिन के लिए एक ही स्मृति स्थान का उपयोग करता है या यह गतिशील रूप से अंतरिक्ष बनाता है और चर को यादृच्छिक रूप से प्रारंभ करता है?

मेरा दूसरा सबराउटिन भी एक चर बनाता है, लेकिन फिर पहले सबराउटिन को कॉल करता है। परिणाम अनियमित वैरिएबल के मुद्रित यादृच्छिक संख्या को छोड़कर अलग है। मैं बहुत असमंजस में हूँ। कृपया सहायता कीजिए!

आपको बहुत बहुत धन्यवाद।

+1

फोर्टन को सिखाया जाता है? – jonnystoten

+0

भाषा पूरी तरह से पढ़ाया नहीं जाता है। यह प्रोग्रामिंग भाषा पाठ्यक्रम के लिए एचडब्ल्यू का हिस्सा है। यह प्रोग्रामिंग भाषा संरचना सीखने और फोरट्रान 77 जैसी पुरानी भाषा का उपयोग करने के बारे में अधिक है, वास्तव में घरों को अंक देता है। हमारा पाठ्यक्रम जावा के आसपास ज्यादातर घूमता है। – mm2887

उत्तर

11

फोरट्रान 77 & 90/95/2003 में, यदि आप एक सबरूटीन सबरूटीन कॉल पर संरक्षित करने के लिए एक चर स्थानीय का मूल्य चाहते हैं, आप यह घोषणा करना चाहिए "बचाने" विशेषता, जैसे, (फोरट्रान 90 शैली का उपयोग):

integer, save :: counter 

या

integer :: counter 
save :: counter 

। या, यदि आप "बचाने" व्यवहार सभी चर पर लागू करना चाहते सिर्फ सबरूटीन एक सरल किसी भी चर बिना

save 

बयान में शामिल हैं। फोरट्रान 90 में, एक घोषणा में एक चर प्रारंभ,

integer :: counter = 0 

स्वचालित रूप से विशेषता को बचाने का अधिग्रहण किया। मुझे नहीं लगता कि फोर्ट्रान 77 में यह मामला था।

यह एक ऐसा क्षेत्र है जिसमें प्रयोग भ्रामक हो सकते हैं - वे आपको बताएंगे कि एक विशेष कंपाइलर क्या करता है, लेकिन संभवतः फोरट्रान 77 भाषा मानक क्या नहीं है , न ही अन्य कंपाइलर क्या किया। कई पुराने फोरट्रान 77 कंपाइलर्स ने स्टैक पर स्थानीय चर नहीं लगाए और निहित रूप से सभी चरों में सहेजने की विशेषता थी, प्रोग्रामिंग के बिना घोषणा की गई। उदाहरण के लिए, यह लोकप्रिय डीईसी फोरट्रान कंपाइलर्स के मामले में था। यह विरासत फोरट्रान 77 प्रोग्रामों के लिए आम है, जिनका उपयोग केवल इस प्रकार के एक विशेष कंपाइलर के साथ आधुनिक कंपाइलर के साथ खराब होने के लिए किया जाता था क्योंकि प्रोग्रामर इसे आवश्यक चर पर सहेजने वाले गुण का उपयोग करना भूल गए थे। मूल रूप से इससे कोई समस्या नहीं आई क्योंकि सभी चरों में प्रभावी रूप से सहेजने की विशेषता थी।अधिकांश आधुनिक कंपाइलर्स स्टैक पर सहेजे बिना स्थानीय चर डालते हैं, और ये प्रोग्राम अक्सर खराब हो जाते हैं क्योंकि कुछ चर जिन्हें "सेव" की आवश्यकता होती है, उनके मूल्यों को सबराउटिन कॉल में भूल जाते हैं। यह समस्या चर की पहचान करके और सहेजने (कार्य) को जोड़कर, प्रत्येक सबराउटिन (कम काम) में एक सेव स्टेटमेंट जोड़कर तय किया जा सकता है, या पुराने कंप्रेसर को पुनर्स्थापित करने के लिए कई कंपाइलर्स के पास एक विकल्प (उदाहरण के लिए, gofran में स्वचालित-स्वचालित) होता है (आसान)।

यह एक असाधारण सवाल प्रतीत होता है - आपको "फोरट्रान 77" के बारे में पता नहीं चल जाएगा, लेकिन एक विशेष संकलक के बारे में। और फोरट्रान 95/2003 के बजाय फोरट्रान 77 का उपयोग क्यों करें? क्या प्रोफेसर है लगता है कि 1 9 77 में फोरट्रान रुक गया?

+1

मेरे उत्तर और उच्च प्रदर्शन चिह्न में जोड़ने के लिए: आप जो खोज रहे हैं वह "अपरिभाषित" है - जब आप एक स्थानीय चर के मूल्य की जांच करते हैं, तो एक सबराउटिन के दूसरे आमंत्रण पर सहेजने वाले गुण के बिना, उस चर को पुन: प्रारंभ किए बिना, आपने उल्लंघन किया है भाषा मानक और व्यवहार अपरिभाषित है। विशेष कंपाइलर के कार्यान्वयन के आधार पर कुछ भी हो सकता है। यदि चर ढेर पर हैं, तो आप कुछ "यादृच्छिक" मान देखेंगे। अगर उन्हें एक निश्चित स्मृति स्थान पर रखा गया है, तो आप पिछले मान देखेंगे। –

5

@MSB द्वारा बनाए गए एक बिंदु पर विस्तार करने के लिए;

फोरट्रान मानक मानकों को लागू करने के लिए संकलक-लेखकों को नहीं बताते हैं, वे प्रोग्रामर के लिए दिखाई देने वाले कार्यक्रमों के व्यवहार से चिंतित हैं। तो सवाल का जवाब यह है कि 'यह सब संकलक पर निर्भर करता है'। और ओपी हमें नहीं बताता कि वह किस कंपाइलर का उपयोग कर रहा है।

इसके अलावा, यदि आप कभी भी लिखे गए सभी FORTRAN77 कंपाइलरों की जांच करने के लिए समय के झुकाव के माध्यम से पीछे हट जाते हैं, तो मुझे पूरा भरोसा है कि आपको अपनी रुचि रखने वाली सुविधाओं के विभिन्न कार्यान्वयन की एक विस्तृत विविधता मिलेगी, उनमें से कई काफी गूढ़ हार्डवेयर वास्तुकला।

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