그들은 악한가? 아마도. 전역의 문제점은 제한없이 실행되는 기능이나 코드로 인해 언제든지 액세스하고 수정할 수 있다는 것입니다. 이로 인해 추적 및 설명이 어려운 상황이 발생할 수 있습니다. 그러므로 가능하면 지구의 양을 최소화하여 그 양을 0으로 되 돌리는 것이 바람직하다.
그들은 피할 수 있습니까? 거의 항상 그렇습니다. 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;
}
이 경우 두 기능의 서명도 변경해야합니다.
이것이 가능하지 않거나 바람직하지 않을 수 있기 때문에, 강제 프로그램 구조를 수정하지 않고 Arduino 프로그램에서 대부분의 전역을 제거하는 유일한 방법이 있습니다.
내가 올바르게 기억한다면, C 대신 Arduino를 프로그래밍 할 때 C ++을 완벽하게 사용할 수 있습니다. OOP (Object Oriented Programming) 또는 C ++에 익숙하지 않은 경우에는 익숙하지 않을 수 있습니다. 독서.
내 제안은 Program 클래스를 만들고이 클래스의 단일 글로벌 인스턴스를 만드는 것입니다. 클래스는 객체의 청사진으로 간주되어야합니다.
다음 예제 프로그램을 고려하십시오.
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à, 우리는 거의 모든 세계를 제거했습니다. 애플리케이션 로직 추가를 시작하는 기능 은 Program::setup()
and Program::loop()
기능입니다. 이 함수는 인스턴스의 특정 멤버 변수에 액세스 할 수 있습니다 myFirstSampleVariable
및 mySecondSampleVariable
전통 반면, setup()
및 loop()
이러한 변수는 클래스 개인을 표시 한으로 액세스 할 수없는 기능입니다. 이 개념을 데이터 캡슐화 또는 데이터 숨기기 라고 합니다 .
OOP 및 / 또는 C ++을 가르치는 것은이 질문에 대한 답변에서 약간 벗어난 것이므로 여기서 멈출 것입니다.
요약하면 : 지구본을 피해야하며 지구본의 양을 대폭 줄이는 것이 거의 항상 가능합니다. 또한 Arduino를 프로그래밍 할 때도 마찬가지입니다.
가장 중요한 것은 내 대답이 당신에게 다소 유용하기를 바랍니다. :)