带有嵌套 if 语句的 While 循环 - C
While loop with nested if statements - C
我正在尝试为 iRobot 编程的项目。对于这个项目,我有一个部分需要这个机器人 运行 直线,除非按下碰撞传感器。当按下不同的碰撞传感器时,应该会发生不同的事情,然后它应该继续直线移动。这是我到目前为止的代码:
while( ReadBumpSensors() == 0)
{
drive(200, RAD_STRAIGHT);
if ( ReadBumpSensors() == 1 )
{
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200, 1);
delayMs(500);
drive(200, RAD_STRAIGHT);
}
if ( ReadBumpSensors() == 2)
{
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
}
if ( ReadBumpSensors() == 3)
{
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
}
}
我没有收到任何错误,但机器人只是直线移动,没有响应任何 if 语句。我觉得这是某种语法错误,但我不确定。有什么建议吗?
你的while
循环条件是ReadBumpSensors() == 0
,所以与if
语句相关的块不会被执行,除非[=15=的return值] 在 while
和 if
.
的条件评估之间发生变化
也许您想做这样的事情:
for(;;) /* infinite loop */
{
switch (ReadBumpSensors())
{
case 0:
drive(200, RAD_STRAIGHT);
break;
case 1:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200, 1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
case 2:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
case 3:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
}
}
更新:案例2和案例3的程序是一样的,可以这样合并。
for(;;) /* infinite loop */
{
switch (ReadBumpSensors())
{
case 0:
drive(200, RAD_STRAIGHT);
break;
case 1:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200, 1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
case 2:
case 3:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
}
}
我不确定 ReadBumpSensors()
函数在内部做了什么,但是只有当它 returns 0 时你才会进入这个循环。当这种情况发生时,你总是会直接进入一个位,然后如果 ReadBumpSensors()
的下三个调用将 return 为 1、2 或 3,则可能会做其他事情。
您可以尝试将 if 结构从三个不同的 if 更改为 if-elseif-elseif 结构,前提是这些操作中只有一个应该在单个循环中发生。
我正在尝试为 iRobot 编程的项目。对于这个项目,我有一个部分需要这个机器人 运行 直线,除非按下碰撞传感器。当按下不同的碰撞传感器时,应该会发生不同的事情,然后它应该继续直线移动。这是我到目前为止的代码:
while( ReadBumpSensors() == 0)
{
drive(200, RAD_STRAIGHT);
if ( ReadBumpSensors() == 1 )
{
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200, 1);
delayMs(500);
drive(200, RAD_STRAIGHT);
}
if ( ReadBumpSensors() == 2)
{
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
}
if ( ReadBumpSensors() == 3)
{
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
}
}
我没有收到任何错误,但机器人只是直线移动,没有响应任何 if 语句。我觉得这是某种语法错误,但我不确定。有什么建议吗?
你的while
循环条件是ReadBumpSensors() == 0
,所以与if
语句相关的块不会被执行,除非[=15=的return值] 在 while
和 if
.
也许您想做这样的事情:
for(;;) /* infinite loop */
{
switch (ReadBumpSensors())
{
case 0:
drive(200, RAD_STRAIGHT);
break;
case 1:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200, 1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
case 2:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
case 3:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
}
}
更新:案例2和案例3的程序是一样的,可以这样合并。
for(;;) /* infinite loop */
{
switch (ReadBumpSensors())
{
case 0:
drive(200, RAD_STRAIGHT);
break;
case 1:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200, 1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
case 2:
case 3:
drive(-200, RAD_STRAIGHT);
delayMs(1000);
drive(200,-1);
delayMs(500);
drive(200, RAD_STRAIGHT);
break;
}
}
我不确定 ReadBumpSensors()
函数在内部做了什么,但是只有当它 returns 0 时你才会进入这个循环。当这种情况发生时,你总是会直接进入一个位,然后如果 ReadBumpSensors()
的下三个调用将 return 为 1、2 或 3,则可能会做其他事情。
您可以尝试将 if 结构从三个不同的 if 更改为 if-elseif-elseif 结构,前提是这些操作中只有一个应该在单个循环中发生。