2010-07-28 9 views
14

fortran 95 में, यदि आप घोषणा में एक चर निर्दिष्टघोषणा और बचाओ पर फोरट्रान काम का श्रेय पकड़ लिया

integer :: var = 0 

यह बराबर है

integer, save :: var = 0 

करने और चर इसलिए दिनचर्या निष्पादन के बाद संरक्षित है (सी बोलने में static के बराबर है) और फिर से कॉल किए जाने पर पुन: प्रारंभ नहीं किया जाता है। ऐसे (आईएमएचओ खतरनाक) व्यवहार के पीछे तर्क/तकनीकी मुद्दा क्या है?

+2

पूर्णता के लिए, मुझे बताएं कि फोरट्रान 2003 मानक में आप जिस बिंदु का उल्लेख करते हैं वह सी 1107 में शामिल है: "यदि किसी प्रकार का ऑब्जेक्ट जिसके लिए घटक-प्रारंभिक निर्दिष्ट किया गया है (R444) विनिर्देश-भाग में प्रकट होता है मॉड्यूल का और इसमें अलोक्साबल या पॉइंटर विशेषता नहीं है, ऑब्जेक्ट में SAVE विशेषता होगी। " –

+0

@Alexandros Gezerlis - ठीक है, लेकिन वह पूछ रहा है कि उन्होंने "क्यों" काम किया है, और अब जब मैं उनके प्रश्न को समझता हूं, तो मेरे पास भी यही प्रश्न है :)। – dcp

+0

मुझे पता है, इसलिए मैंने इसे उत्तर के रूप में पोस्ट नहीं किया है। –

उत्तर

8

मुझे नहीं लगता कि इस तरह के व्यवहार के पीछे कुछ तर्क है।

लेकिन जहां तक ​​मुझे पता है, स्टीफानो, आपने गलत शब्दावली का उपयोग किया था। आपके कोड में कोई असाइनमेंट स्टेटमेंट प्रारंभिक अभिव्यक्ति (0) का उपयोग करके केवल परिवर्तनीय (var) प्रारंभिकता नहीं है।

integer :: var = 0 ! type declaration & initialization 

integer :: var ! type declaration 
var = 0  ! assignment 

तो ऐसा लगता है कि यह केवल समिति डिजाइन निर्णय था। अगर हमारे पास ऐसी अभिव्यक्ति है (समानता चिह्न प्रकार घोषणा घोषणा कथन के साथ) यह प्रारंभिकता असाइनमेंट नहीं है। और प्रारंभिक कार्यक्रम (और प्रक्रियाओं) निष्पादन के दौरान केवल एक बार होता है।

हालांकि इस तरह के निर्णय के लिए कुछ ऐतिहासिक कारण हो सकते हैं। this धागा पर एक नज़र डालें।

आज ऐसा व्यवहार खतरनाक है क्योंकि कई अन्य व्यापक रूप से उपयोग की जाने वाली भाषा प्रारंभिक/असाइनमेंट के बारे में एक और सम्मेलन का पालन करती है।

+0

यदि यह एक जानबूझकर डिजाइन निर्णय है, तो क्या मुझे शायद एक प्रश्न पोस्ट करना चाहिए "फोरट्रान समिति के सदस्यों को निर्णय लेने के दौरान धूम्रपान करने की अनुमति क्या है?" :) गंभीरता से। मुझे नहीं लगता कि वे इतनी बुरी तरह खराब हो गए हैं, इसलिए एक कारण होना चाहिए, शायद संगतता या तकनीकी मुद्दों में निहित हो। यह अपने स्वयं के लिए एक डिजाइन निर्णय होने के लिए बहुत अजीब लगता है। –

+1

@ स्टेफानो: कुछ ऐतिहासिक कारण भी हो सकते हैं और धूम्रपान नहीं कर सकते हैं। =) इस धागे को पढ़ें: http://www.rhinocerus.net/forum/lang-fortran/92384- आरंभिक-local-variables.html – Wildcat

+0

मुझे लगता है कि आप बस जगह पर हिट! लिंक जोड़ने के लिए कृपया अपना उत्तर संपादित करें। –

6

कई पुराने फोरट्रान 77 और पहले के कंपाइलर्स ने सभी चर आवंटित किए। कई प्रोग्रामर इस व्यवहार पर भरोसा करते थे - यह तकनीकी रूप से उनके कार्यक्रमों में एक बग था जब तक कि उन्होंने घोषणा में "सेव" क्वालीफायर का उपयोग नहीं किया (या प्रत्येक प्रक्रिया में एक सादा सेव स्टेटमेंट जोड़ा गया) चर के मूल्य को पुन: परिभाषित करने के लिए अपरिभाषित किया गया था प्रक्रिया। लेकिन चूंकि उन दिनों में कार्यक्रमों को वर्षों के लिए एक विशेष मंच और कंपाइलर से बंधे हुए थे, प्रोग्रामर इससे दूर हो गए। यह एक आधुनिक फोर्ट्रान> = 9 0 कंपाइलर्स के लिए विरासत FORTRAN 77 कोड पोर्टिंग में एक बहुत ही आम "गोचा" है। अधिकांश कंपाइलर्स इस व्यवहार को पुनर्स्थापित करने के लिए संकलन-समय स्विच प्रदान करते हैं, जैसे gfortran के fno-automatic विकल्प। सबसे अधिक संभावना है कि समिति ने वेरिएबल्स को देखा जो उनकी घोषणा में शुरू किए गए थे, क्योंकि मेरी राय में, एक उचित डिजाइन निर्णय - SAVE विशेषता की आवश्यकता है। मुझे लगता है कि अन्य भाषाओं से सबसे अलग क्या है, और बहुभाषी प्रोग्रामर को भ्रमित करने के लिए सबसे आसान है, यह है कि प्रारंभिकरण केवल एक बार किया जाता है।

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