Apakah satu kali (satu kali) eksekusi di loop selamanya atau void loop?
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
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 :)
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 once
sintaks 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"))
}
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