Я хочу сделать синтаксис выполнения один раз или один раз внутри цикла навсегда (пустой цикл) для любых языков программирования.
Решение, которое я нашел, заключается в том, чтобы сделать новую переменную логической «выполненной» и установить ее в значение «истина» после выполнения.
Это нормально, но что, если я хочу выполнить однократное выполнение с другим синтаксисом? Должен ли я снова сделать новую переменную логической? Это будет неэффективно. Представьте, что существует много синтаксиса, но я должен создать новое логическое выполнение для каждого синтаксиса.
Решение - это функция, я думаю
Например
void loop()
{
lcd.print("OK");
}
ЭТО БУДЕТ ПЕЧАТЬ НАВСЕГДА Я бы хотел, чтобы там была такая функция
void loop()
{
once(lcd.print("OK"));
}
поэтому «один раз» - это функция со строкой параметров, которая предназначена для команды/синтаксиса.
один раз ("команда")
Я видел это. Но это разрушает цикл пустоты, я хочу, чтобы цикл пустоты продолжал работать с некоторым синтаксисом, который я выбираю сделать один раз в цикле пустоты. И я могу снова активировать в следующий раз еще один раз, когда захочу в цикле пустоты.
Есть ли тонкая разница между выполнением цикла один раз и уничтожением цикла?
Разрушение того, что я имею в виду, похоже на разрыв;
Вы смотрели решения @philomech ниже?
Да, это то, что я сказал в ветке, его решение использует booelan для одного сеанса «если». Представьте, если бы было много сеансов. Итак, мне нужно снова создать новую логическую переменную, насколько это возможно?
Это похоже на решение № 3 от @philomech.
Не могли бы вы объяснить ваш конкретный случай? Это может быть проблема XY и решаться совершенно по-другому.
Я делаю простую операционную систему на Arduino. И с этим немного сложно.
Вот один из способов сделать это:
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()». В противном случае только с глобальными логическими значениями возможно что-то подобное.
Обратите внимание, что это только мои предложения, основанные на моем опыте, но это не обязательно означает, что другие решения недоступны. Надеюсь, что все еще помогает :)
Да, это правда.. я делаю интерфейс на ардуино
В случае строки/символа, как «ввод» может иметь двойной тип данных? (Строка и символ)
@MuhammadIkhwanPerwira да, ты прав! Насколько мне известно, двойных типов нет. Тем не менее, для полноты я подумал, что поместил туда тип данных char и String.
В 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);
}
Поскольку лямбда имеет уникальный тип, у вас есть один флаг по лямбде:
Взгляните на stackoverflow.com/a/27832896/2041317. Это решит вашу проблему?