सबसे बुनियादी अंतर स्कोप का है।
पहले मामले में, आप एक वैश्विक चर घोषित कर रहे हैं। यह एक ऐसा चर है जो अपनी परिभाषा के बाद हर क्षेत्र में सुलभ है।
void setup()
{
Serial.begin(9600);
}
void inc();
int count = 0;
void loop()
{
Serial.println(count);
count++;
inc();
delay(500);
}
void inc() //Can edit the value of count
{
count=count+1;
};
दूसरे मामले में, आप स्थानीय क्षेत्र के साथ एक स्थिर चर घोषित कर रहे हैं। वैरिएबल पूरे प्रोग्राम के लिए ग्लोबल वैरिएबल की तरह ही चलता रहेगा, लेकिन इसे घोषित किए गए कोड ब्लॉक में ही एक्सेस किया जा सकेगा। यह एक ही उदाहरण है, जिसमें केवल एक बदलाव है। count
अब अंदर एक स्थिर चर के रूप में घोषित किया गया है loop
।
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
यह संकलित नहीं करेगा क्योंकि फ़ंक्शन inc()
तक पहुंच नहीं है count
।
वैश्विक चर, हालांकि उपयोगी प्रतीत होते हैं, कुछ नुकसान के साथ आते हैं। यहां तक कि नुकसान भी हो सकता है जब यह उन कार्यक्रमों को लिखने की बात आती है जो भौतिक परिवेश के साथ बातचीत कर सकते हैं। किसी चीज का यह बहुत ही मूल उदाहरण है जो कि होने की संभावना है, जैसे ही कार्यक्रम बड़े होने लगते हैं। एक फ़ंक्शन अनजाने में एक वैश्विक चर की स्थिति को बदल सकता है।
void setup()
{
Serial.begin(9600);
}
void another_function();
int state=0;
void loop()
{
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Inadvertently changes state
state=1;
}
ऐसे मामलों को डीबग करना बहुत कठिन है। हालाँकि, इस प्रकार की समस्या का आसानी से पता लगाया जा सकता है, बस एक स्थिर चर का उपयोग करके।
void setup()
{
Serial.begin(9600);
}
void another_function();
void loop()
{
static int state=0;
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Results in a compile time error. Saves time.
state=1;
}