【问题标题】:Make for loop continue until a goal is accomplished使 for 循环继续,直到完成目标
【发布时间】:2017-10-13 08:07:53
【问题描述】:

我需要能够找到 EEPROM 存储器的 5 个连续位,理想情况下最接近 2(因为我有与其他数据相关联的位 #1 和 2,并希望保持井井有条)。我开发了这段代码,它可以工作,但 for 循环在找到一组好的数字后继续。

Serial.println("got to assignment number finder");
for (int AssignCheck = 2; AssignCheck < 250; AssignCheck++){
  Serial.println("Finding a good assignment number " + String(AssignCheck));
  if (EEPROM.read(AssignCheck) == 255){          //Looks for a blank space which can be used to store the new card
    if (EEPROM.read(AssignCheck + 1) == 255){
      if (EEPROM.read(AssignCheck + 2) == 255){
        if (EEPROM.read(AssignCheck + 3) == 255){
          if (EEPROM.read(AssignCheck + 4) == 255){
            Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ".  Scanner value = " + String(Scanner));
            int StoreValue = AssignCheck;
          }
        }
      }
    }
  }
}

然后我想我可以在它周围放一个 while 循环,一旦变量设置为 0 而不是 1,就让 while 循环停止,所以我写了这个:(注意 while 循环的引入,变量和中间的Scanner = 0 行)。

Serial.println("got to assignment number finder");
int Scanner = 1;
while (Scanner == 1){
  for (int AssignCheck = 2; AssignCheck < 250; AssignCheck++){
    Serial.println("Finding a good assignment number " + String(AssignCheck) + ".  Scanner value = " + String(Scanner));
    if (EEPROM.read(AssignCheck) == 255){          //Looks for a blank space which can be used to store the new card
      if (EEPROM.read(AssignCheck + 1) == 255){
        if (EEPROM.read(AssignCheck + 2) == 255){
          if (EEPROM.read(AssignCheck + 3) == 255){
            if (EEPROM.read(AssignCheck + 4) == 255){
              Scanner = 0;
              Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ".  Scanner value = " + String(Scanner));
              int StoreValue = AssignCheck;
            }
          }
        }
      }
    }
  }
}

它在我需要时正确识别并将变量设置为 0,但 while 循环似乎没有影响,并且循环继续产生可以工作的数字集。

作为一名新手编码员,我不确定接下来可以尝试什么。

任何建议将不胜感激。

【问题讨论】:

  • 只需在最后一个if 中添加一个break;
  • 或者如果你需要 while 来做别的事情,在 for 循环的条件中添加第二个中断条件的检查
  • 如何编写正确的 C 代码:使用 5 个嵌套的 if 语句而不是循环。另外,为什么 5 个未编程的 eeprom 单元是理想的结果?这没有任何意义。 XY 问题。

标签: loops for-loop while-loop arduino


【解决方案1】:

在这种情况下,您可以使用指令break

Serial.println("got to assignment number finder");
for (int AssignCheck = 2; AssignCheck < 250; AssignCheck++){
  Serial.println("Finding a good assignment number " + String(AssignCheck));
  if (EEPROM.read(AssignCheck) == 255){          //Looks for a blank space which can be used to store the new card
    if (EEPROM.read(AssignCheck + 1) == 255){
      if (EEPROM.read(AssignCheck + 2) == 255){
        if (EEPROM.read(AssignCheck + 3) == 255){
          if (EEPROM.read(AssignCheck + 4) == 255){
            Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ".  Scanner value = " + String(Scanner));
            int StoreValue = AssignCheck;
            break;
          }
        }
      }
    }
  }
}

您可以阅读here,它完全符合您的要求。

请注意,您的第二次尝试不起作用,因为 for loop 在 while 内:它在整个 for loop 之前完成,然后比较while loop

你可以这样改:

Serial.println("got to assignment number finder");
int Scanner = 1;
for (int AssignCheck = 2; (AssignCheck < 250) && (Scanner == 1); AssignCheck++){
  Serial.println("Finding a good assignment number " + String(AssignCheck) + ".  Scanner value = " + String(Scanner));
  if (EEPROM.read(AssignCheck) == 255){          //Looks for a blank space which can be used to store the new card
    if (EEPROM.read(AssignCheck + 1) == 255){
      if (EEPROM.read(AssignCheck + 2) == 255){
        if (EEPROM.read(AssignCheck + 3) == 255){
          if (EEPROM.read(AssignCheck + 4) == 255){
            Scanner = 0;
            Serial.println("Found assignment numbers " + String(AssignCheck) + " through to " + String(int(AssignCheck) + 4) + ".  Scanner value = " + String(Scanner));
            int StoreValue = AssignCheck;
          }
        }
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    读取 EEPROM 很贵,请考虑这个:

    Serial.println("got to assignment number finder");
    int Scanner = 1;
    char rollingBuffer[5];
    rollingBuffer[0] = EEPROM.read(2 + 0);
    rollingBuffer[1] = EEPROM.read(2 + 1);
    rollingBuffer[2] = EEPROM.read(2 + 2);
    rollingBuffer[3] = EEPROM.read(2 + 3);
    rollingBuffer[4] = EEPROM.read(2 + 4);
    pointRoll = 0;
    for (int AssignCheck = 7; (AssignCheck < 255); AssignCheck++)
    {
        if ((rollingBuffer[0] == 255) && (rollingBuffer[1] == 255) && (rollingBuffer[2] == 255) && (rollingBuffer[3] == 255) && (rollingBuffer[4] == 255))
        {
            Serial.println("Found assignment numbers " + String(AssignCheck-5) + " through to " + String(int(AssignCheck-1)) + ".  Scanner value = " + String(Scanner));
            int StoreValue = AssignCheck;
            break;
        }
        rollingBuffer[pointRoll] = EEPROM.read(AssignCheck);
        pointRoll++;
        if (pointRoll > 4) pointRoll = 0;
    }
    

    【讨论】:

    • “读取 EEPROM 很昂贵” 那么如果算法不需要读取 5 次,为什么还要读取呢?
    猜你喜欢
    • 2017-07-20
    • 2020-09-24
    • 2021-12-27
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多