while循环使用嵌套的if语句--C

时间:2015-11-09 15:53:57

标签: c syntax robot

我正在尝试为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语句。我觉得这是某种类型的语法错误,但我不确定。有什么建议吗?

2 个答案:

答案 0 :(得分:6)

while循环的条件是ReadBumpSensors() == 0,因此if语句的块不会被执行,因为ReadBumpSensors()的返回值在评估之间发生变化whileif的条件。

也许你想做这样的事情:

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;
    }
}

答案 1 :(得分:0)

我不确定ReadBumpSensors()函数在内部执行什么操作,但只有当它返回0时才会处于此循环中。当发生这种情况时,您将总是直接进行一点,然后可能如果ReadBumpSensors()的下三次调用将返回1,2或3,则执行其他操作。

如果只有一个操作应该在一个循环中发生,你可以尝试将if-structure从三个不同的if更改为if-elseif-elseif -structure。