forever 루프 또는 void 루프에서 한 번 (한 번) 실행합니까?
모든 프로그램 언어에 대해 forever 루프 (무효 루프) 내에서 한 번 또는 한 번 실행 구문을 만들고 싶습니다.
내가 해결책을 찾은 것은 새로운 변수 부울을 "실행"하고 실행 후 true로 설정하는 것입니다.
괜찮지 만 다른 구문으로 한 번 실행하려면 어떻게해야합니까? 새 변수를 다시 부울로 만들어야합니까? 효율적이지 않습니다. 많은 구문이 있지만 각 구문에 대해 새로운 bool 실행 파일을 만들어야한다고 상상해보십시오.
해결책은 내가 생각하는 기능입니다.
예를 들면
void loop()
{
lcd.print("OK");
}
이것은 영원히 인쇄됩니다.
void loop()
{
once(lcd.print("OK"));
}
따라서 "once"는 명령 / 구문을위한 매개 변수 문자열이있는 함수입니다.
한 번 ( "명령")
답변
이에 접근하는 몇 가지 방법
다음은 이러한 작업이 일반적으로 수행되는 방법에 대한 매우 일반적인 방법입니다. 이미 제안했듯이 전역 부울을 사용합니다 .
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
}
}
특정 답변이 입력과 관련하여 한 번만 인쇄되는 함수는 if / else 루프로 보관할 수 있습니다 . 문자열을 시작할 때 한 번만 인쇄해야하는 경우 "setup ()"생성자에서 인쇄합니다. 그렇지 않으면 전역 부울로 그와 같은 것이 가능합니다.
이는 내 경험을 바탕으로 한 제안 일 뿐이지 만 반드시 다른 솔루션을 사용할 수 없다는 의미는 아닙니다. 여전히 도움이되기를 바랍니다. :)
할 수있는 한 가지 방법은 다음과 같습니다.
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"))
}
C ++에는 std::call_oncemulti_thread도 있으므로 일반적으로 수행 할 수 있습니다.
template <typename F>
void simple_do_once(F f)
{
static std::once_flag flag;
std::call_once(flag, f);
}
람다는 고유 한 유형을 가지므로 람다별로 하나의 플래그가 있습니다.
데모