그들은 악한가? 아마도. 전역의 문제점은 제한없이 실행되는 기능이나 코드로 인해 언제든지 액세스하고 수정할 수 있다는 것입니다. 이로 인해 추적 및 설명이 어려운 상황이 발생할 수 있습니다. 그러므로 가능하면 지구의 양을 최소화하여 그 양을 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를 프로그래밍 할 때도 마찬가지입니다.
가장 중요한 것은 내 대답이 당신에게 다소 유용하기를 바랍니다. :)