Apakah satu kali (satu kali) eksekusi di loop selamanya atau void loop?

Dec 12 2020

Saya ingin membuat satu kali atau satu kali eksekusi sintaks di dalam loop selamanya (void loop) untuk bahasa program apa pun.

Apa yang saya temukan solusinya adalah dengan membuat variabel baru boolean "dieksekusi" dan disetel ke true setelah dieksekusi.

Tidak apa-apa, tetapi bagaimana jika saya ingin melakukan sekali eksekusi ke sintaks lainnya? Haruskah saya membuat variabel boolean baru lagi? Itu tidak akan efisien. Bayangkan ada banyak sintaks tetapi saya harus membuat eksekusi bool baru untuk setiap sintaks.

Solusinya adalah fungsi menurut saya

Sebagai contoh

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

INI AKAN DICETAK SELAMANYA Saya berharap ada fungsi seperti ini

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

jadi "Once" adalah sebuah fungsi dengan parameter string yang mana untuk perintah / sintaks.

sekali ("perintah")

Jawaban

1 Paul Dec 12 2020 at 13:28

Beberapa cara untuk mendekati ini

Berikut ini adalah cara yang sangat umum tentang bagaimana operasi semacam itu biasa dilakukan. Seperti yang sudah Anda sarankan, dengan boolean global :

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

Lakukan sesuatu hanya sekali setelah waktu tertentu :

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

Dan berkat utas ini , dengan keluar dari loop (mungkin bukan yang Anda cari):

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

Tetapi saya kira Anda mencoba membuat semacam antarmuka, di mana jawaban spesifik dicetak terkait dengan input pengguna (mungkin banyak kemungkinan) ?! Dalam hal ini tergantung pada input apa yang Anda dapatkan:

Dalam kasus Bilangan Bulat :

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

Dalam kasus Stings / chars , Anda perlu menggunakan "if loop" melalui setiap masukan yang mungkin (atau dengan array String / 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
  }
}

Fungsi yang Anda cari, di mana jawaban spesifik hanya dicetak SEKALI mengenai input dapat diarsipkan dengan loop if / else . Jika String harus dicetak satu kali saat startup, cetak di konstruktor "setup ()". Jika tidak, hanya dengan boolean global, hal seperti itu mungkin terjadi.

Perhatikan bahwa itu hanya saran saya berdasarkan pengalaman saya, tetapi itu tidak berarti bahwa solusi lain tidak tersedia. Semoga masih bisa membantu :)

1 AyxanHaqverdili Dec 12 2020 at 13:12

Inilah salah satu cara Anda dapat melakukannya:

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

Anda dijamin bahwa variabel ini diinisialisasi satu kali.

Jika Anda menginginkan oncesintaks dalam pertanyaan Anda, Anda dapat mencapai sesuatu yang serupa dengan makro:

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


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

Di C ++ std::call_onceyang bahkan ada multi_thread, maka Anda bisa melakukannya secara umum:

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

Karena lambda memiliki tipe yang unik, Anda memiliki satu bendera oleh lambda:

Demo