พวกมันชั่วร้ายเหรอ? อาจจะ. ปัญหาเกี่ยวกับ globals คือพวกเขาสามารถเข้าถึงและแก้ไขได้ทุกเวลาโดยฟังก์ชั่นหรือชิ้นส่วนของโค้ดที่ถูกเรียกใช้โดยไม่มีข้อ จำกัด สิ่งนี้อาจนำไปสู่สถานการณ์ที่ยากจะย้อนกลับและอธิบายได้ หากเป็นไปได้ให้นำจำนวนกลับมาเป็นศูนย์จึงเป็นที่ต้องการ
พวกเขาสามารถหลีกเลี่ยงได้? เกือบตลอดเวลา ปัญหากับ Arduino คือว่าพวกเขาบังคับให้คุณเป็นแบบนี้วิธีการสองฟังก์ชั่นที่พวกเขาถือว่าคุณและคุณsetup() loop()ในกรณีพิเศษนี้คุณไม่สามารถเข้าถึงขอบเขตของฟังก์ชันผู้โทรของทั้งสองฟังก์ชัน (อาจmain()) หากคุณมีคุณจะสามารถกำจัดตัวเองของกลมและใช้คนในท้องถิ่นแทน
รูปภาพต่อไปนี้:
int main() {
  setup();
  while (true) {
    loop();
  }
  return 0;
}
นี่อาจเป็นสิ่งที่ฟังก์ชั่นหลักของโปรแกรม Arduino ดูเหมือนจะมากหรือน้อย ตัวแปรที่คุณต้องการทั้งในsetup()และloop()ฟังก์ชั่นนั้นควรถูกประกาศภายในขอบเขตของmain()ฟังก์ชั่นมากกว่าขอบเขตส่วนกลาง จากนั้นพวกเขาสามารถทำให้สามารถเข้าถึงฟังก์ชั่นอื่น ๆ ของทั้งสองโดยผ่านพวกเขาเป็นข้อโต้แย้ง (ใช้ตัวชี้ถ้าจำเป็น)
ตัวอย่างเช่น:
int main() {
  int myVariable = 0;
  setup(&myVariable);
  while (true) {
    loop(&myVariable);
  }
  return 0;
}
โปรดทราบว่าในกรณีนี้คุณต้องเปลี่ยนลายเซ็นของทั้งสองฟังก์ชัน
เนื่องจากนี่อาจเป็นไปไม่ได้หรือไม่เป็นที่ต้องการฉันเห็นทางเดียวเท่านั้นที่จะลบ globals ส่วนใหญ่ออกจากโปรแกรม Arduino โดยไม่ต้องดัดแปลงบังคับกับโครงสร้างของโปรแกรม
ถ้าฉันจำได้อย่างถูกต้องคุณสามารถใช้ C ++ ในขณะที่เขียนโปรแกรมสำหรับ Arduino แทนที่จะเป็น C หากคุณยังไม่คุ้นเคยกับOOP (การเขียนโปรแกรมเชิงวัตถุ)หรือ C ++ อาจต้องใช้ความคุ้นเคยบ้าง การอ่าน
ข้อเสนอของฉันคือการสร้างคลาสโปรแกรมและสร้างอินสแตนซ์ส่วนกลางของคลาสนี้ ชั้นควรได้รับการพิจารณาพิมพ์เขียวสำหรับวัตถุ
พิจารณาตัวอย่างโปรแกรมต่อไปนี้:
class Program {
public:      
  Program();
  void setup();
  void loop();
private:
  int myFirstSampleVariable;
  int mySecondSampleVariable;
};
Program::Program() :
  myFirstSampleVariable(0),
  mySecondSampleVariable(0)
{
}
void Program::setup() {
  // your setup code goes here
}
void Program::loop() {
  // your loop code goes here
}
Program program; // your single global
void setup() {
  program.setup();
}
void loop() {
  program.loop();
}
ตอนนี้เราได้กำจัดตัวเองจากเกือบทั้งหมด ฟังก์ชั่นที่คุณจะเริ่มเพิ่มตรรกะแอปพลิเคชันของคุณจะเป็นProgram::setup()และProgram::loop()ฟังก์ชั่น ฟังก์ชั่นเหล่านี้มีการเข้าถึงตัวแปรสมาชิกเฉพาะอินสแตนซ์myFirstSampleVariableและmySecondSampleVariableในขณะที่ฟังก์ชั่นแบบดั้งเดิมsetup()และloop()ฟังก์ชั่นไม่สามารถเข้าถึงได้เนื่องจากตัวแปรเหล่านี้ได้รับการทำเครื่องหมายคลาสส่วนตัว แนวคิดนี้เรียกว่าการห่อหุ้มข้อมูลหรือการซ่อนข้อมูล
การสอนคุณ OOP และ / หรือ C ++ นั้นไม่ใช่คำตอบสำหรับคำถามนี้ดังนั้นฉันจะหยุดที่นี่
เพื่อสรุป: ควรหลีกเลี่ยง globals และเป็นไปได้ที่จะลดจำนวนของ globals ลงอย่างมาก นอกจากนี้เมื่อคุณเขียนโปรแกรมสำหรับ Arduino
ที่สำคัญที่สุดฉันหวังว่าคำตอบของฉันจะเป็นประโยชน์กับคุณ :)