¿Ejecutar una vez (una vez) en un ciclo para siempre o un ciclo vacío?

Dec 12 2020

Quiero hacer una sintaxis de ejecución única o única dentro del bucle para siempre (bucle vacío) para cualquier lenguaje de programa.

Lo que encontré, la solución es hacer que la nueva variable booleana "ejecute" y se establezca en verdadero después de la ejecución.

Está bien, pero ¿y si quiero ejecutar una vez en otra sintaxis? ¿Debo volver a hacer una nueva variable booleana? No será eficiente. Imagine que hay muchas sintaxis, pero debo hacer una nueva ejecución bool para cada sintaxis.

La solución es la función, creo

Por ejemplo

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

ESTO SE IMPRIMIRÁ PARA SIEMPRE Deseo que funcionen así

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

así que "una vez" es una función con una cadena de parámetro que es para comando / sintaxis.

una vez ("comando")

Respuestas

1 Paul Dec 12 2020 at 13:28

Varias formas de abordar esto

A continuación se muestra una forma muy común de cómo se realiza habitualmente dicha operación. Como ya sugirió, con un booleano global :

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

Haz algo solo una vez después de un tiempo específico :

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");
  }
}

Y gracias a este hilo, al salir del bucle (puede que no sea lo que estás buscando):

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

Pero supongo que estás intentando hacer algún tipo de interfaz, donde se imprime una respuesta específica con respecto a la entrada del usuario (¡probablemente muchas posibilidades)! En ese caso, depende de las entradas que esté obteniendo:

En caso de enteros :

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

En el caso de Stings / chars , necesita ir con un "bucle if" a través de cada entrada posible (o con una matriz de 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
  }
}

Una función que está buscando, donde una respuesta específica solo se imprime UNA VEZ con respecto a una entrada, se puede archivar mediante bucles if / else . Si una cadena debe imprimirse una sola vez al inicio, imprímala en el constructor "setup ()". De lo contrario, solo con booleanos globales es posible algo así.

Tenga en cuenta que esas son solo mis sugerencias basadas en mi experiencia, pero no necesariamente significa que no haya otras soluciones disponibles. Espero que eso ayude todavía :)

1 AyxanHaqverdili Dec 12 2020 at 13:12

Aquí tienes una forma de hacerlo:

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

Tiene la garantía de que esta variable se inicializa una vez.

Si desea la oncesintaxis en su pregunta, puede lograr algo similar con una macro:

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


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

En C ++, hay std::call_onceque incluso multi_thread, entonces puedes hacerlo genéricamente:

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

Como lambda tiene un tipo único, tiene una bandera por lambda:

Manifestación