如何在while循环中处理多个类似的条件?

时间:2015-10-15 20:39:23

标签: c while-loop arduino microcontroller

对不起那些难以捉摸的标题感到抱歉,但这里是我将用来解释我的问题的代码!

false

如何避免为while(motors[0].cycle <= maxcycle && motors[1].cycle <= maxcycle && motors[2].cycle <= maxcycle && motors[3].cycle <= maxcycle && motors[4], etc ...) 循环键入这么长的条件,因为我总是检查相同的参数,只有我的结构的索引正在改变。

8 个答案:

答案 0 :(得分:6)

  

我怎么能避免输入这么长的条件,知道我总是检查相同的参数,只有我的结构的索引正在改变。

添加一个函数来执行检查并使用while语句中的函数。

// MotorType is my contrived type. Use the right type.
bool doCheck(MotorType* motors, int count, int maxcycle)
{
   for (int i = 0; i < count; ++i )
   {
      if ( !(motors[0].cycle <= maxcycle) )
      {
         return false;
      }
   }
   return true;
}

while(doCheck(motors, count, maxcycle))
{
}

答案 1 :(得分:4)

C ++ 11及更高版本允许您使用 lambda 将自定义检查功能折叠为std::all_of的调用:

while (std::all_of(std::begin(motors), std::end(motors),
                   [=](Motor m){ return m.cycle < maxcycle; })) 
{
    ...

Demo

答案 2 :(得分:0)

将条件抽象为方法。

Sorting

然后使用自己的迭代定义该方法:

GridView

答案 3 :(得分:0)

将它分解为一个单独的函数并在单独的函数中遍历数组,并返回true,它会一直执行,如果if检查失败,则返回false。

答案 4 :(得分:0)

你可以循环:

while(true)
{
  for(int i = 0, i < number, i++)
  {
    if (motors[i].cycle > maxcycle)
    {
      break;
    }
  }
  //Do something
}

答案 5 :(得分:0)

这里建议添加功能的所有答案都做到了......好吧,不一定是最好的方法。原因如下:

由于循环被置于单独的函数中,并且motors的数量不是常量,编译器很可能使用实际循环而不会展开它。当您计算纳秒时,自然循环会对性能造成危害。 但是,原始示例没有这个问题,因为它根本没有循环。

解决方案:提供一个根本不使用循环的函数,或者让编译器更容易展开它。

答案 6 :(得分:0)

将它放入lambda的检查中:

#include <algorithm>

...
void myFunction(){

    auto allCycling = [&]() -> bool { // lambda function, capture by reference
        return std::all_of( // for every element in the given range
          motors.begin(), motors.end(), // given range is all of the motors container
          [](const decltype(motors[0])& motor) -> bool {
            return motor.cycle <= maxcycle; // check
          });

    while(allCycling()){
        //do stuff
    }
}

通过引用[&]捕获lambda,可以访问lambda中的所有函数范围变量,而无需担心复制它们的成本。

答案 7 :(得分:0)

我将投入TMP版本:

template < size_t I >
struct check_it
{
    static bool call(motor_type * motors)
    {
       return check_it<I-1>::call(motors) && motors[I].cycles <= maxcycles;
    }
 }

 template < >
 struct check_it<0>
 {
     static bool call(motor_type * motors) { return motors[0].cycles <= maxcycles; }
 };

 while (check_it<42>::call(motors)) { ... }

编辑:我不一定推荐这个,但它应该优化到你写的内容。很难说它实际上是否更快。将取决于缓存中有多少指令等...也许?您想要了解它是否重要。