forever 루프 또는 void 루프에서 한 번 (한 번) 실행합니까?

Dec 12 2020

모든 프로그램 언어에 대해 forever 루프 (무효 루프) 내에서 한 번 또는 한 번 실행 구문을 만들고 싶습니다.

내가 해결책을 찾은 것은 새로운 변수 부울을 "실행"하고 실행 후 true로 설정하는 것입니다.

괜찮지 만 다른 구문으로 한 번 실행하려면 어떻게해야합니까? 새 변수를 다시 부울로 만들어야합니까? 효율적이지 않습니다. 많은 구문이 있지만 각 구문에 대해 새로운 bool 실행 파일을 만들어야한다고 상상해보십시오.

해결책은 내가 생각하는 기능입니다.

예를 들면

void loop()
{
lcd.print("OK");
}

이것은 영원히 인쇄됩니다.

void loop()
{
once(lcd.print("OK"));
}

따라서 "once"는 명령 / 구문을위한 매개 변수 문자열이있는 함수입니다.

한 번 ( "명령")

답변

1 Paul Dec 12 2020 at 13:28

이에 접근하는 몇 가지 방법

다음은 이러한 작업이 일반적으로 수행되는 방법에 대한 매우 일반적인 방법입니다. 이미 제안했듯이 전역 부울을 사용합니다 .

bool once = true; // global variable
void loop() {
  if (once) { // being called only once
    lcd.print("OK");
    once = false;
  }
}

특정 시간 후에 한 번만 수행하십시오 .

void loop() {
  // millis() is the time in milliseconds after the startup 
  //if you want to print something once after a specific amount of time
  //this also includes a little "wait time" of 100 milliseconds as the statement might be asked with a delay
  if (mills() >= 1000 && mills() <= 1100) {// time in milliseconds
    lcd.print("OK");
  }
}

그리고 덕분에 이 스레드와 루프를 종료 (당신이 검색되지 않을 수도 있습니다 무엇을) :

void loop() {
  lcd.print("OK");
  exit(0);  //The 0 is required to prevent compile error.
}

그러나 사용자 입력에 대한 특정 답변이 인쇄되는 일종의 인터페이스를 만들려고한다고 가정합니다 (아마도 많은 가능성) ?! 이 경우 어떤 입력을 받고 있는지에 따라 다릅니다.

정수의 경우 :

void loop() {
  switch (input) { //input must be an integer
    case 0:
      lcd.print("OK"); //prints "ok" if input is 0
    case 1:
      lcd.print("Hello"); //prints "Hello" if input is 1
  }
}

의 경우 괴롭 / 문자 , 당신은 모든 가능한 입력 저점에 "만약 루프"로 이동해야합니다 (또는 문자열 / 문자의 배열) :

void loop() {
  lcd.print("Turn off?"); //asks if it should do something
  if (input == "yes") { //String input
    lcd.print("OK, shut down!");
    //do something
  }
  else if (input == 'n' || input == 'N') { //char input
    lcd.print("OK, no shut down!");
    //do something
  }
}

특정 답변이 입력과 관련하여 한 번만 인쇄되는 함수는 if / else 루프로 보관할 수 있습니다 . 문자열을 시작할 때 한 번만 인쇄해야하는 경우 "setup ()"생성자에서 인쇄합니다. 그렇지 않으면 전역 부울로 그와 같은 것이 가능합니다.

이는 내 경험을 바탕으로 한 제안 일 뿐이지 만 반드시 다른 솔루션을 사용할 수 없다는 의미는 아닙니다. 여전히 도움이되기를 바랍니다. :)

1 AyxanHaqverdili Dec 12 2020 at 13:12

할 수있는 한 가지 방법은 다음과 같습니다.

void loop()
{
    { // execute once. Can put this in a separate function also
        static bool executed = (lcd.print("OK"), true);
    }
}

이 변수는 한 번 초기화됩니다.

once질문에 구문 을 원하면 매크로를 사용하여 비슷한 것을 얻을 수 있습니다.

#define ONCE(...) \
{\
 static bool executed = ([&]{__VA_ARGS__;}(), true); \
}


void loop()
{
    ONCE(lcd.print("OK"))
}
1 Jarod42 Dec 12 2020 at 15:32

C ++에는 std::call_oncemulti_thread도 있으므로 일반적으로 수행 할 수 있습니다.

template <typename F>
void simple_do_once(F f)
{
    static std::once_flag flag;
    std::call_once(flag, f);
}

람다는 고유 한 유형을 가지므로 람다별로 하나의 플래그가 있습니다.

데모