永久ループまたは無効ループで1回(1回)実行しますか?

Dec 12 2020

プログラム言語の永久ループ(voidループ)内で1回または1回の実行構文を作成したいと思います。

私が解決策を見つけたのは、新しい変数ブール値を「実行」し、実行後にtrueに設定することです。

大丈夫ですが、他の構文を一度実行したい場合はどうすればよいですか?新しい変数ブール値を再度作成する必要がありますか?それは効率的ではありません。多くの構文があると想像してみてください。しかし、構文ごとに新しいboolexecutiinを作成する必要があります。

解決策は私が思う機能です

例えば

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

これは永遠に印刷されます私はそこにこのような機能があればいいのに

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

したがって、「once」は、コマンド/構文用のパラメータ文字列を持つ関数です。

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
  }
}

Stings / charsの場合、すべての可能な入力を介して「ifループ」を使用する必要があります(またはStrings / charsの配列を使用します)。

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
  }
}

特定の回答が入力に関して1回だけ出力される、探している関数は、if / elseループによってアーカイブできます。文字列を起動時に一度だけ出力する必要がある場合は、「setup()」コンストラクターで出力します。そうでなければ、グローバルブール値だけでそのようなことが可能です。

これらは私の経験に基づく私の提案にすぎないことに注意してください。ただし、必ずしも他のソリューションが利用できないことを意味するわけではありません。それがまだ役立つことを願っています:)

1 AyxanHaqverdili Dec 12 2020 at 13:12

これがあなたがそれをすることができる1つの方法です:

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_onceは、multi_threadもあるので、一般的にそれを行うことができます。

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

ラムダには一意のタイプがあるため、ラムダごとに1つのフラグがあります。

デモ