ความแตกต่างพื้นฐานที่สุดคือขอบเขต
ในกรณีแรกคุณจะประกาศตัวแปรทั่วโลก มันเป็นตัวแปรที่สามารถเข้าถึงได้ในทุกขอบเขตหลังจากการนิยาม
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;
}