Выполнить однократное (один раз) выполнение в цикле навсегда или в цикле пустоты?

Я хочу сделать синтаксис выполнения один раз или один раз внутри цикла навсегда (пустой цикл) для любых языков программирования.

Решение, которое я нашел, заключается в том, чтобы сделать новую переменную логической «выполненной» и установить ее в значение «истина» после выполнения.

Это нормально, но что, если я хочу выполнить однократное выполнение с другим синтаксисом? Должен ли я снова сделать новую переменную логической? Это будет неэффективно. Представьте, что существует много синтаксиса, но я должен создать новое логическое выполнение для каждого синтаксиса.

Решение - это функция, я думаю

Например

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

ЭТО БУДЕТ ПЕЧАТЬ НАВСЕГДА Я бы хотел, чтобы там была такая функция

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

поэтому «один раз» - это функция со строкой параметров, которая предназначена для команды/синтаксиса.

один раз ("команда")

Взгляните на stackoverflow.com/a/27832896/2041317. Это решит вашу проблему?

cup 12.12.2020 06:23

Я видел это. Но это разрушает цикл пустоты, я хочу, чтобы цикл пустоты продолжал работать с некоторым синтаксисом, который я выбираю сделать один раз в цикле пустоты. И я могу снова активировать в следующий раз еще один раз, когда захочу в цикле пустоты.

Muhammad Ikhwan Perwira 12.12.2020 06:26

Есть ли тонкая разница между выполнением цикла один раз и уничтожением цикла?

cup 12.12.2020 06:27

Разрушение того, что я имею в виду, похоже на разрыв;

Muhammad Ikhwan Perwira 12.12.2020 06:29

Вы смотрели решения @philomech ниже?

cup 12.12.2020 06:29

Да, это то, что я сказал в ветке, его решение использует booelan для одного сеанса «если». Представьте, если бы было много сеансов. Итак, мне нужно снова создать новую логическую переменную, насколько это возможно?

Muhammad Ikhwan Perwira 12.12.2020 06:35

Это похоже на решение № 3 от @philomech.

cup 12.12.2020 07:11

Не могли бы вы объяснить ваш конкретный случай? Это может быть проблема XY и решаться совершенно по-другому.

Sami Kuhmonen 12.12.2020 07:12

Я делаю простую операционную систему на Arduino. И с этим немного сложно.

Muhammad Ikhwan Perwira 12.12.2020 08:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
685
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот один из способов сделать это:

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"))
}
Ответ принят как подходящий

Несколько подходов к этому

Ниже приведен очень распространенный способ выполнения такой операции. Как вы уже предложили, с глобальным логическим значением:

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

Функция, которую вы ищете, где конкретный ответ печатается только ОДИН раз относительно ввода, может быть просто заархивирован циклами if/else. Если строка должна быть напечатана только один раз при запуске, напечатайте ее в конструкторе «setup()». В противном случае только с глобальными логическими значениями возможно что-то подобное.

Обратите внимание, что это только мои предложения, основанные на моем опыте, но это не обязательно означает, что другие решения недоступны. Надеюсь, что все еще помогает :)

Да, это правда.. я делаю интерфейс на ардуино

Muhammad Ikhwan Perwira 12.12.2020 08:58

В случае строки/символа, как «ввод» может иметь двойной тип данных? (Строка и символ)

Muhammad Ikhwan Perwira 12.12.2020 09:21

@MuhammadIkhwanPerwira да, ты прав! Насколько мне известно, двойных типов нет. Тем не менее, для полноты я подумал, что поместил туда тип данных char и String.

Paul 12.12.2020 17:58

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

Поскольку лямбда имеет уникальный тип, у вас есть один флаг по лямбде:

Демо

Другие вопросы по теме