พวกมันชั่วร้ายเหรอ? อาจจะ. ปัญหาเกี่ยวกับ 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
ที่สำคัญที่สุดฉันหวังว่าคำตอบของฉันจะเป็นประโยชน์กับคุณ :)