为什么我的嵌套 while 循环不起作用?
Why is my nested while loop not working?
我目前正在使用 RobotC 为 Vex 2.0 Cortex 编程。我正在使用编码器让我的机器人直行。
这是我的代码:
void goforwards(int time)
{
int Tcount = 0;
int speed1 = 40;
int speed2 = 40;
int difference = 10;
motor[LM] = speed1;
motor[RM] = speed2;
while (Tcount < time)
{
nMotorEncoder[RM] = 0;
nMotorEncoder[LM] = 0;
while(nMotorEncoder[RM]<1000)
{
int REncoder = -nMotorEncoder[RM];
int LEncoder = -nMotorEncoder[LM];
if (LEncoder > REncoder)
{
motor[LM] = speed1 - difference;
motor[RM] = speed2 + difference;
if (motor[RM]<= 0)
{
motor[RM] = 40;
motor[LM] = 40;
}
}
if (LEncoder < REncoder)
{
motor[LM] = speed1 + difference;
motor[RM] = speed2 - difference;
if (motor[RM]<= 0)
{
motor[RM] = 40;
motor[LM] = 40;
}
Tcount ++;
}
}
}
}
task main()
{
goforwards(10);
}
作为参考,这些是我的 Pragma 设置:
#pragma config(I2C_Usage, I2C1, i2cSensors)
#pragma config(Sensor, dgtl2, , sensorDigitalIn)
#pragma config(Sensor, dgtl7, , sensorDigitalOut)
#pragma config(Sensor, I2C_1, , sensorQuadEncoderOnI2CPort, , AutoAssign )
#pragma config(Sensor, I2C_2, , sensorQuadEncoderOnI2CPort, , AutoAssign )
#pragma config(Motor, port1, RM, tmotorVex393_HBridge, openLoop, reversed, encoderPort, I2C_2)
#pragma config(Motor, port10, LM, tmotorVex393_HBridge, openLoop, encoderPort, I2C_1)
当我执行代码时,机器人的编码器值非常接近,但是当它们达到 1000 时机器人停止移动。我认为我编写的代码应该 return 编码器的值在之后回到 0它们达到 1000,因此代码应该在 shell 循环中重复 10 次(在本例中)。我做错了什么?
您在错误的地方更新 Tcount
。就在外循环的末尾执行。
您现在所写的每向前一步都会使 Tcount
增加。当它达到 1000 步时,Tcount
已经是 1000。
你的times
是10。所以`Tcount >= time,它不会再次进入外层while循环。
似乎内循环的控制变量(即nMotorEncoder[RM])永远不会更新,这意味着内循环将永远迭代。也就是说,你永远不会回到外部循环体
我目前正在使用 RobotC 为 Vex 2.0 Cortex 编程。我正在使用编码器让我的机器人直行。
这是我的代码:
void goforwards(int time)
{
int Tcount = 0;
int speed1 = 40;
int speed2 = 40;
int difference = 10;
motor[LM] = speed1;
motor[RM] = speed2;
while (Tcount < time)
{
nMotorEncoder[RM] = 0;
nMotorEncoder[LM] = 0;
while(nMotorEncoder[RM]<1000)
{
int REncoder = -nMotorEncoder[RM];
int LEncoder = -nMotorEncoder[LM];
if (LEncoder > REncoder)
{
motor[LM] = speed1 - difference;
motor[RM] = speed2 + difference;
if (motor[RM]<= 0)
{
motor[RM] = 40;
motor[LM] = 40;
}
}
if (LEncoder < REncoder)
{
motor[LM] = speed1 + difference;
motor[RM] = speed2 - difference;
if (motor[RM]<= 0)
{
motor[RM] = 40;
motor[LM] = 40;
}
Tcount ++;
}
}
}
}
task main()
{
goforwards(10);
}
作为参考,这些是我的 Pragma 设置:
#pragma config(I2C_Usage, I2C1, i2cSensors)
#pragma config(Sensor, dgtl2, , sensorDigitalIn)
#pragma config(Sensor, dgtl7, , sensorDigitalOut)
#pragma config(Sensor, I2C_1, , sensorQuadEncoderOnI2CPort, , AutoAssign )
#pragma config(Sensor, I2C_2, , sensorQuadEncoderOnI2CPort, , AutoAssign )
#pragma config(Motor, port1, RM, tmotorVex393_HBridge, openLoop, reversed, encoderPort, I2C_2)
#pragma config(Motor, port10, LM, tmotorVex393_HBridge, openLoop, encoderPort, I2C_1)
当我执行代码时,机器人的编码器值非常接近,但是当它们达到 1000 时机器人停止移动。我认为我编写的代码应该 return 编码器的值在之后回到 0它们达到 1000,因此代码应该在 shell 循环中重复 10 次(在本例中)。我做错了什么?
您在错误的地方更新 Tcount
。就在外循环的末尾执行。
您现在所写的每向前一步都会使 Tcount
增加。当它达到 1000 步时,Tcount
已经是 1000。
你的times
是10。所以`Tcount >= time,它不会再次进入外层while循环。
似乎内循环的控制变量(即nMotorEncoder[RM])永远不会更新,这意味着内循环将永远迭代。也就是说,你永远不会回到外部循环体