हमेशा के लिए लूप या शून्य लूप में एक बार (एक बार) निष्पादन करें?

Dec 12 2020

मैं किसी भी प्रोग्राम भाषाओं के लिए हमेशा के लिए लूप (शून्य लूप) के अंदर एक बार या एक बार निष्पादन वाक्यविन्यास करना चाहता हूं।

मैंने जो समाधान पाया वह नए परिवर्तनशील बूलियन को "निष्पादित" करने के साथ है और निष्पादित होने के बाद सही पर सेट है।

यह ठीक है, लेकिन क्या होगा अगर मैं एक बार अन्य सिंटैक्स को निष्पादित करना चाहता हूं? क्या मुझे फिर से नया परिवर्तनशील बूलियन बनाना चाहिए? यह अपवित्र नहीं होगा। कई सिंटैक्स की कल्पना करें, लेकिन मुझे प्रत्येक सिंटैक्स के लिए नई बूल निष्पादन करना चाहिए।

समाधान कार्य मुझे लगता है

उदाहरण के लिए

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

मैं इस तरह से काम करना चाहते हैं, लेकिन मैं इस तरह से कार्य करना चाहता हूं

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

इसलिए "एक बार" पैरामीटर स्ट्रिंग के साथ एक फ़ंक्शन है जो कमांड / सिंटैक्स के लिए है।

एक बार ("कमांड")

जवाब

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

एक फ़ंक्शन जिसकी आप तलाश कर रहे हैं, जहां एक विशिष्ट उत्तर केवल इनपुट के संबंध में ONCE प्रिंट करता है, अगर / अन्यथा लूप द्वारा संग्रहीत किया जा सकता है। यदि स्ट्रिंग को स्टार्टअप पर केवल एक बार प्रिंट किया जाना चाहिए, तो इसे "सेटअप ()" कंस्ट्रक्टर में प्रिंट करें। अन्यथा सिर्फ वैश्विक बूलियंस के साथ ऐसा कुछ संभव है।

ध्यान दें कि वे केवल मेरे अनुभव के आधार पर मेरे सुझाव हैं, लेकिन इसका मतलब यह नहीं है कि अन्य समाधान उपलब्ध नहीं हैं। आशा है कि अभी भी मदद करता है :)

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_onceवह भी बहु_थ्रेड है, तो आप इसे उदारतापूर्वक कर सकते हैं:

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

जैसा कि लैम्ब्डा का अद्वितीय प्रकार है, आपके पास लैम्बडा द्वारा एक ध्वज है:

डेमो