Pages

Monday, 20 June 2016

Storage of Class in C / स्टोरेज क्लास

Storage of Class in C

स्टोरेज क्लास का संबंध सी के वेरिएबल  से हैं। स्टोरेज क्लास किसी वेरिएबल  के स्टोरेज लोकेसन तथा सीमाओ के बारे मे बताता हैं। यहाँ पर स्टोरेज लोकेसन का मतलब हैं की कम्प्युटर मे वेरिएबल  कहाँ पर मौजूद होगा, तथा उसका प्रारम्भिक मान क्या होगा। और सीमाओ का अर्थ हैं की वेरिएबल  प्रोग्राम के किसी एक फंक्शन तक सीमित होगा या पूरे प्रोग्राम मे वह कही से भी एक्सैस किया जा सकेगा। नीचे दिये कुछ बिन्दुओ के मध्य से संक्षिप्त मे जानते हैं की स्टोरेज क्लास क्या होता हैं।

1 वेरिएबल  कहाँ पर स्टोर होगा।

2 वेरिएबल  की प्रारम्भिक वैल्यू क्या होगी?

3 वेरिएबल  का स्कोप क्या होगा, यानि वेरिएबल  पूरे प्रोग्राम मे एक्सैस होगा या सिर्फ किसी निश्चित फंक्शन मे एक्सैस होगा?

4 वेरिएबल  का लाइफ क्या होगी, यानि प्रोग्राम मे वेरिएबल  का अस्तित्व कब तक रहेगा। क्योंकि कई वेरिएबल  ऐसे होंगे जो एक प्रोग्राम क्रियान्वयन मे कई बार अस्तित्व मे आएंगे और काम पूरा हो जाने के बाद तुरंत ही नष्ट हो जाएंगे, जबकि कुछ ऐसे वेरिएबल  होते हैं जो प्रोग्राम के प्रारम्भ से लेकर प्रोग्राम के अंत तक अस्तित्व मे रहते हैं।

सरल परिभाषा

“जिस प्रकार भारत मे भारतीय जनता को भारत सरकार ने चार क्लास मे बाँट रखा हैं ठीक उसी प्रकार सी भाषा मे वेरिएबल  को भी चाल क्लास मे बांटा गया हैं। भारत मे क्लास को जाती के आधार पर बांटा गया है तो सी मे क्लास, वेरिएबल  के स्टोरेज के आधार पर किया गया हैं। अगर कोई वेरिएबल  प्रोसेसर की मेमोरी मे बनाया गया हैं वह अलग क्लास का वेरिएबल  हैं, तो वही कुछ वेरिएबल  रैम की मेमोरी मे बनाए जाते हैं, तो यह वेरिएबल  अलग क्लास का वेरिएबल  होगा।”

सी प्रोग्राम मे 4 प्रकार के स्टोरेज क्लास पाये जाते हैं जिनके नाम निम्न प्रकार से नीचे दिये जा रहे हैं।

1 Automatic Storage Class

2 External Variable

3 Static Variable

4 Register Variable


1 ऑटोमैटिक वेरिएबल  

ऑटोमैटिक स्टोरेज क्लास का वेरिएबल  जब भी प्रोग्राम मे बनाया जाता हैं तो उसको बनाने के लिए निम्न कोड लिखा जाता हैं।


ऊपर दिये चित्र मे आप देख सकते है, दो प्रोग्राम दिए हुआ हैं, एक का नाम method1 और दूसरे का नाम method2 हैं। दोनों प्रोग्राम मे आप देख सकते हैं वेरिएबल  डिक्लेयर किया गया हैं, यह दोनों वेरिएबल  ऑटोमैटिक स्टोरेज क्लास वेरिएबल  हैं। अगर आप कोई वेरिएबल  बनाने (डिक्लेयर) करने जा रहे है और डाटा टाइप के पहले कोई भी स्टोरेज क्लास का नाम नहीं लिखते हैं, तब ऐसी स्थिति मे जो वेरिएबल  बनेगा वह स्वतः ही ऑटोमैटिक स्टोरेज क्लास का वेरिएबल  कहलाएगा। जैसे की ऊपर दिये चित्र के method1 मे आप देख सकते हैं।

अब यह समझते हैं की अगर कोई वेरिएबल  ऑटोमैटिक क्लास का हैं, तो उस वेरिएबल  के क्या गुण होंगे।

1 स्टोरेज – इस प्रकार के वेरिएबल  रैम मे बनाए जाते हैं।

2 प्रारम्भिक मान – ऐसे वेरिएबल  का प्रारम्भिक मान गारबेज होता हैं। जिसके बारे मे अनुमान नहीं लगाया जा सकता।

3 स्कोप : यह जिस फंक्शन के अंदर परिभाषित होता हैं केवल उसी फंक्शन तक इसकी पहुच होती हैं तथा प्रोग्राम के दूसरे फंक्शन के लिए ऐसे वेरिएबल  अंजान होते हैं।

4 लाइफ : जिस ब्लाक मे ये वेरिएबल  परिभाषित होते है जब तक वह ब्लाक क्रियान्वित हैं जब तक ही ये वेरिएबल  सक्रिय होते हैं इसके बाद ये नष्ट हो जाते हैं।


2 एक्सटर्नल वेरिएबल  स्टोरेज क्लास

एक्सटर्नल क्लास के वेरिएबल , ऐसे वेरिएबल  होते हैं जिनकी पहुच पूरे प्रोग्राम मे होती हैं, तथा इन्हे प्रोग्राम मे कही से भी एक्सैस किया जा सकता हैं। इनको परिभाषित करने के दो तरीके हैं जिनहे नीचे दिये प्रोग्राम मे बताया गया हैं।


मेथड1 मे हम देख सकते हैं की x नाम का वेरिएबल  परिभाषित किया गया हैं। जो की मेन फंक्शन के बाहर हैं। एसे वेरिएबल , एक्सटर्नल क्लास के वेरिएबल  कहे जाते हैं। यहाँ पर एक प्रश्न दिमाग मे आ रहा हैं की इसी तरह से ऑटोमैटिक वेरियाबले को भी परिभाषित किया जाता हैं तो फिर एक्सटर्नल और ऑटोमैटिक मे हमे फर्क कैसे पता चलेगा?

 
दोनों मे फर्क समझना बहुत ही आसान हैं, अगर कोई वेरिएबल  किसी फंक्शन के अंदर परिभाषित है तो यह समझना चाहिए की यह वेरिएबल  ऑटोमैटिक क्लास का हैं। जबकि अगर कोई वेरिएबल  किसी फंक्शन के बाहर परिभाषित हो तब यह समझना चाहिए की यह एक्सटर्नल क्लास का वेरिएबल  हैं।

अब यह समझते हैं की अगर कोई वेरिएबल  एक्सटर्नल क्लास का हैं, तो उस वेरिएबल  के क्या गुण होंगे।

1 स्टोरेज – इस क्लास के वेरिएबल  मेमोरी (रैम) पर बनते हैं।

2 प्रारम्भिक वैल्यू – इस प्रकार के वेरिएबल  की प्रारम्भिक वैल्यू शून्य होती हैं।

3 स्कोप – पूरे प्रोग्राम मे यह एक्सैस किए जा सकते हैं।

4 लाइफ – एक्सटर्नल क्लास के वेरिएबल  की लाइफ पूरे प्रोग्राम के क्रियान्वयन के समय रहती हैं। यानि प्रोग्राम के शुरू होने से लेकर प्रोग्राम के अंत तक इसका अस्तित्व होता हैं।


अब नीचे दो प्रोग्राम देखते हैं जिसमे हम एक्सटर्नल वेरिएबल  के स्वभाव को जानेंगे। पहले प्रोग्राम मे एक्सटर्नल किबर्ड का उपयोग न करते हुये, एक्सटर्नल क्लास वेरिएबल  बनाया गया हैं तथा उसे प्रोग्राम मे मौजूद सभी फंक्शन द्वारा एक्सैस करते दिखाया जा रहा हैं। नीचे दिये प्रोग्राम मे आप देख रहे हैं की एक वेरिएबल  जिसका नाम a हैं, परिभाषित किया गया है main() फंक्शन के ऊपर, पर इसमे एक्सटर्नल कीवर्ड का प्रयोग नहीं किया गया हैं। क्योंकि आ किसी भी फंक्शन के अंदर परिभाषित नहीं हैं, अगर आ किसी फंक्शन के अंदर परिभाषित होता तब इसके आगे extern कीवर्ड लगाना जरूरी होता नहीं तो वह वेरिएबल  ऑटोमैटिक क्लास का वेरिएबल  कहलाता।


ऊपर दिये प्रोग्राम मे आप देख रहे हैं की तीन फंक्शन बनाए गए हैं, और तीनों फंक्शन a वेरिएबल को एक्सैस कर रहे हैं, ऐसा इसलिए हो रहा हैं क्योंकि a किसी फंक्शन के अंदर नहीं परिभाषित किया गया हैं बल्कि प्रोग्राम मे मौजूद सभी फंक्शन के बाहर परिभाषित किया गया हैं। इस प्रकार हम बिना extern कीवर्ड के एक्सटर्नल क्लास का वेरिएबल  बनाते हैं। अब इस प्रोग्राम के आउटपुट को देखते हैं। 


प्रोग्राम के आउटपुट को देखने से हमे एक्सटर्नल क्लास के वेरिएबल  के लाइफ के बारे मे जानकारी पता चलता हैं। इस प्रोग्राम मे a नाम का वेरिएबल  बनाया गया, जिसमे वैल्यू 10 स्टोर हैं। इसके बाद main() फंक्शन के अंदर हम वेरिएबल  a को एक्सैस कर रहे हैं और उसकी वैल्यू को प्रिंट कर रहे हैं, अब आउटपुट मे देखे a = 10 प्रिंट हुआ। इससे यह पता चलता हैं की a मे स्टोर की गई वैल्यू जो की 10 थी अभी भी मेमोरी मे मौजूद हैं, अब main() मे दो बार increment() और दो बार decrement() फंक्शन उपयोग हुये हैं, increment() जब क्रियान्वित होता हैं, तो वह a की वैल्यू मे 1 जोड़ देता हैं। अब वापस आउटपुट की दूसरी और तीसरी लाइन देखिये जिसमे लिखा हुआ हैं a = 11 और a = 12 क्रमशः। जिससे यह साफ पता चलता हैं की जब increment फंकशन call हुआ तब a की पुरानी वैल्यू यानि 10 a मे स्टोर थी, जो साफ तौर पर यह इशारा करता हैं की एक्सटर्नल क्लास के वेरिएबल  का जीवन काल पूरे प्रोग्राम क्रियान्वयन के समय बना रहता हैं। जबकि ऑटोमैटिक क्लास के वेरिएबल  का जीवन काल केवल उस फंक्शन के क्रियान्वयन तक ही रहता हैं जिसमे वह परिभाषित होता हैं। अब नीचे एक प्रोग्राम दिया हुआ हैं जिसमे हम एक्सटर्नल क्लास का वेरिएबल , extern कीवर्ड की सहायता से बनाएँगे।

3 रजिस्टर क्लास वेरिएबल  :

रजिस्टर क्लास का वेरिएबल  बिलकुल ऑटोमैटिक क्लास के वेरिएबल  जैसा होता हैं। बस फर्क सिर्फ इतना हैं की ऑटोमैटिक क्लास का वेरिएबल  कम्प्युटर के रैम मे बनाया जाता हैं जबकि रजिस्टर क्लास का वेरिएबल  CPU प्रॉसेसर मे बनाया जाता हैं। और यह ऑटोमैटिक क्लास के वेरिएबल  की तुलना मे ज्यादा तेज़ी के साथ प्रोसेस होता है।

1 स्टोरेज – इस प्रकार के वेरिएबल  CPU प्रॉसेसरमे बनाए जाते हैं।

2 प्रारम्भिक मान – ऐसे वेरिएबल  का प्रारम्भिक मान गारबेज होता हैं। जिसके बारे मे अनुमान नहीं लगाया जा सकता।

3 स्कोप : यह जिस फंक्शन के अंदर परिभाषित होता हैं केवल उसी फंक्शन तक इसकी पहुच होती हैं तथा प्रोग्राम के दूसरे फंक्शन के लिए ऐसे वेरिएबल  अंजान होते हैं।

4 लाइफ : जिस ब्लाक मे ये वेरिएबल  परिभाषित होते है जब तक वह ब्लाक क्रियान्वित हैं जब तक ही ये वेरिएबल सक्रिय होते हैं इसके बाद ये नष्ट हो जाते हैं।


नीचे दिये प्रोग्राम के माध्यम से हम जानने की कोसिश करेंगे की कैसे रजिस्टर क्लास के वेरिएबल बनाए जाते हैं।


ऊपर दिये प्रोग्राम मे हम देख सकते हैं, की i नाम का एक int टाइप वेरिएबल बनाया गया हैं, जिसके आगे register लिखा गया हैं। जो कंपाइलर को यह बताता हैं की यह रजिस्टर क्लास का वेरिएबल होगा।

4 स्टेटिक स्टोरेज क्लास

स्टोरेज क्लास एक विशेष प्रकार का क्लास हैं, स्टेटिक स्टोरेज क्लास कंपाइलर को यह निर्देश देता हैं की लोकल वेरिएबल जिसकी क्लास स्टेटिक स्टोरेज हैं उसका जीवन चक्र पूरे प्रोग्राम के दौरान बना रहना चाहिए। बार बार उस लोकल वेरिएबल को बनाने और नष्ट करने की जरूरत नहीं हैं।

एक लोकल वेरिएबल जो स्टेटिक क्लास से संबंध नहीं रखता हैं, जब भी उस लोकल वेरिएबल का फंक्शन क्रियान्वित (call) होगा जब जब वह वेरिएबल मेमोरी मे फिर से बनेगा , फिर से initialize होगा, और फंक्शन के समाप्त होते ही वह लोकल वेरिएबल भी समाप्त हो जाएगा। परंतु वह वेरिएबल जो स्टेटिक क्लास के होते हैं, वह लोकल वेरिएबल होते हुए भी मेमोरी मे एक बार ही बनाए जाते हैं तथा एक बार ही initialize होते हैं।

1 स्टोरेज – इस प्रकार के वेरिएबल  रैम (मेमोरी) मे बनाए जाते हैं।

2 प्रारम्भिक मान – ऐसे वेरिएबल  का प्रारम्भिक मान शून्य होता हैं।

3 स्कोप : यह जिस फंक्शन के अंदर परिभाषित होता हैं केवल उसी फंक्शन तक इसकी पहुच होती हैं तथा प्रोग्राम के दूसरे फंक्शन के लिए ऐसे वेरिएबल  अंजान होते हैं।

4 लाइफ : स्टेटिक क्लास के वेरिएबल पूरे प्रोग्राम के दौरान सक्रिय रहते हैं। इंका जीवन काल पूरे प्रोग्राम मे रहता हैं।


अब नीचे दिये प्रोग्राम के माध्यम से यह जानते हैं की स्टेटिक क्लास का वेरिएबल कैसे बनाया जाता हैं। तथा दूसरे कलाम मे एक प्रोग्राम और बनाया गया हैं जिसके आउटपुट के आधार पर यह प्रोग्राम, आपको स्टेटिक वेरिएबल और सामान्य/ऑटोमैटिक वेरिएबल के बीच का फर्क बताएगा।


इस प्रोग्राम का आउटपुट निम्न प्रकार है।


अब अगर आप ऊपर प्रोग्राम मे ध्यान से देखेंगे तो पाएंगे की स्टेटिक क्लास का वेरिएबल बनाने के लिए static कीवद आ प्रयोग डाटा टाइप के पहले किया गया हैं। इसके अलावा अब आप प्रोग्राम के आउटपुट को देखेंगे तो पाएंगे की दोनों के आउटपुट मे अंतर (भिन्नता) हैं। स्टेटिक क्लास का वेरिएबल जो की increment() फंक्शन के अंदर परिभाषित हैं, जब भी increment() फंक्शन रन होता हैं, उसके अंदर मौजूद स्टेटिक क्लास का वेरिएबल i अपनी पुरानी वैल्यू के साथ ही क्रियान्वित (execute) होता हैं। जबकि लोकल वेरिएबल का हल फंक्शन call मे फिर से मेमोरी एलोकेशन और वैल्यू initialization कर रहा हैं, जिसके कारण हर बार i का आउटपुट 1 आ रहा हैं।

एक वास्तविक दुनिया का उदाहरण के माध्यम से स्टेटिक और ऑटोमैटिक वेरिएबल के बीच का फर्क समझते हैं। मानिए कलयुग एक प्रोग्राम हैं एक जन्म किसी C प्रोग्राम के फंक्शन के समान हैं। अब मानिए किसी व्यक्ति का जन्म होता हैं और उसे अपने पुराने सभी जन्मो के बारे मे याद हैं तो हम उस व्यक्ति को स्टेटिक वेरिएबल कहेंगे, जबकि एसे व्यक्ति को ऑटोमैटिक वेरिएबल कहेंगे जिनहे अपने पूर्व जन्मो के बारे मे कुछ भी नहीं याद हैं।

आशा करता हूँ की शायद इस उदाहरण से आपको कुछ लाभ मिला होगा।

No comments:
Write comments

Popular Posts

Recommended Posts ×