Họ có ác không? Có lẽ. Vấn đề với toàn cầu là chúng có thể được truy cập và sửa đổi tại bất kỳ thời điểm nào bởi bất kỳ chức năng hoặc đoạn mã nào được thực thi, mà không bị hạn chế. Điều này có thể dẫn đến các tình huống, giả sử, khó theo dõi và giải thích. Do đó, tối thiểu hóa số lượng toàn cầu, nếu có thể đưa số tiền trở về 0, do đó là mong muốn.
Họ có thể tránh được không? Hầu như luôn luôn có. Vấn đề với Arduino là, họ buộc bạn phải tiếp cận hai chức năng này trong đó họ giả định bạn setup()
và bạn loop()
. Trong trường hợp cụ thể này, bạn không có quyền truy cập vào phạm vi của chức năng người gọi của hai chức năng này (có thể main()
). Nếu bạn có, bạn sẽ có thể thoát khỏi tất cả các thế giới và sử dụng người địa phương thay thế.
Hình ảnh như sau:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
Điều này có lẽ ít nhiều là chức năng chính của chương trình Arduino trông như thế nào. Các biến bạn cần trong cả hàm setup()
và loop()
hàm sau đó tốt nhất sẽ được khai báo bên trong phạm vi của main()
hàm thay vì phạm vi toàn cục. Sau đó, chúng có thể được truy cập vào hai hàm khác bằng cách chuyển chúng dưới dạng đối số (sử dụng con trỏ nếu cần thiết).
Ví dụ:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
Lưu ý rằng trong trường hợp này, bạn cũng cần thay đổi chữ ký của cả hai chức năng.
Vì điều này có thể không khả thi và cũng không mong muốn, tôi thực sự chỉ có một cách để loại bỏ hầu hết các phần mềm toàn cầu khỏi chương trình Arduino mà không sửa đổi cấu trúc chương trình bắt buộc.
Nếu tôi nhớ lại một cách chính xác, bạn hoàn toàn có thể sử dụng C ++ trong khi lập trình cho Arduino, thay vì C. Nếu bạn chưa quen (chưa) với OOP (Lập trình hướng đối tượng) hoặc C ++, có thể bạn sẽ quen với một số đọc hiểu.
Đề xuất của tôi sẽ là tạo một lớp Chương trình và tạo một thể hiện toàn cầu duy nhất của lớp này. Một lớp nên được coi là bản thiết kế cho các đối tượng.
Hãy xem xét chương trình ví dụ sau:
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();
}
Voilà, chúng ta đã loại bỏ hầu hết tất cả các thế giới. Các hàm trong đó bạn sẽ bắt đầu thêm logic ứng dụng của mình sẽ là Program::setup()
và các Program::loop()
hàm. Các hàm này có quyền truy cập vào các biến thành viên cụ thể của cá thể myFirstSampleVariable
và mySecondSampleVariable
trong khi các hàm truyền thống setup()
và loop()
hàm không có quyền truy cập vì các biến này đã được đánh dấu là lớp riêng. Khái niệm này được gọi là đóng gói dữ liệu hoặc ẩn dữ liệu.
Dạy cho bạn OOP và / hoặc C ++ là một chút ngoài phạm vi của câu trả lời cho câu hỏi này vì vậy tôi sẽ dừng ở đây.
Tóm lại: nên tránh toàn cầu và hầu như luôn luôn có thể giảm đáng kể số lượng toàn cầu. Ngoài ra khi bạn đang lập trình cho Arduino.
Quan trọng nhất là tôi hy vọng câu trả lời của tôi có phần hữu ích với bạn :)